gpt4 book ai didi

android - 在android中使用volley将图片上传到node.js后端

转载 作者:行者123 更新时间:2023-11-29 02:37:44 27 4
gpt4 key购买 nike

我正在尝试在 android 和 node.js 后端使用 volley 上传图像。但是当我从后端记录文件时,它是未定义的。该应用程序也停止工作,它立即关闭。我该如何解决这个问题并将图像上传到后端?提前致谢。我是 android 新手。

这是后端

 app.post("/upload", multer({storage: storage}).single('bitmap'), (req, res) => {
// console.log(req.body);
console.log(req.file);
console.log('here');
var db = couchdb.couchConnect('ezymarketplace');
// req.body['photo_url'] = req.file.filename;
req.body['type'] = 'feedback';
var insert = couchdb.couchInsert(db, req.body).then(result => {
res.send({"result": result[0], "status": result[1].statusCode});

}).catch(err => {

});
});

这是主类

@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.buttonChoose:
showPictureDialog();
break;


case R.id.buttonUpload:
uploadImage();
break;
}
}


private void showPictureDialog() {
AlertDialog.Builder pictureDialog = new AlertDialog.Builder(this);
pictureDialog.setTitle("Select Action");
String[] pictureDialogItems = {
"Select photo from gallery",
"Capture photo from camera"};
pictureDialog.setItems(pictureDialogItems,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
switch (which) {
case 0:
choosePhotoFromGallary();
break;
case 1:
takePhotoFromCamera();
break;
}
}
});
pictureDialog.show();
}

public void choosePhotoFromGallary() {
Intent galleryIntent = new Intent(Intent.ACTION_PICK,
MediaStore.Images.Media.EXTERNAL_CONTENT_URI);

startActivityForResult(galleryIntent, GALLERY);
}

private void takePhotoFromCamera() {
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, CAMERA);
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {

super.onActivityResult(requestCode, resultCode, data);
if (resultCode == this.RESULT_CANCELED) {
return;
}
if (requestCode == GALLERY) {
if (data != null) {
Uri contentURI = data.getData();
try {
bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), contentURI);
Log.e("The image", imageToString(bitmap));
imageview.setImageBitmap(bitmap);


} catch (IOException e) {
e.printStackTrace();
}
}

} else if (requestCode == CAMERA) {
Bitmap thumbnail = (Bitmap) data.getExtras().get("data");
imageview.setImageBitmap(thumbnail);
Toast.makeText(MainActivity.this, "Image Saved!", Toast.LENGTH_SHORT).show();
}
}

public String saveImage(Bitmap myBitmap) {
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
myBitmap.compress(Bitmap.CompressFormat.JPEG, 90, bytes);
File wallpaperDirectory = new File(
Environment.getExternalStorageDirectory() + IMAGE_DIRECTORY);
if (!wallpaperDirectory.exists()) {
wallpaperDirectory.mkdirs();
}

try {
File f = new File(wallpaperDirectory, Calendar.getInstance()
.getTimeInMillis() + ".jpg");
f.createNewFile();
FileOutputStream fo = new FileOutputStream(f);
fo.write(bytes.toByteArray());
MediaScannerConnection.scanFile(this,
new String[]{f.getPath()},
new String[]{"image/jpeg"}, null);
fo.close();
Log.d("TAG", "File Saved::--->" + f.getAbsolutePath());

return f.getAbsolutePath();
} catch (IOException e1) {
e1.printStackTrace();
}
return "";
}

private void uploadImage() {
final ProgressDialog loading = ProgressDialog.show(this, "Uploading...", "Please wait...", false, false);
StringRequest stringRequest = new StringRequest(Request.Method.POST, URL_UPLOAD,
new Response.Listener<String>() {
@Override
public void onResponse(String s) {
loading.dismiss();
Toast.makeText(MainActivity.this, s, Toast.LENGTH_LONG).show();
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
loading.dismiss();

Toast.makeText(MainActivity.this, volleyError.getMessage().toString(), Toast.LENGTH_LONG).show();
}
}) {
@Override
protected Map<String, String> getParams() throws AuthFailureError {

String image = imageToString(bitmap);



Map<String, String> params = new Hashtable<String, String>();


params.put(KEY_IMAGE, image);
return params;
}
};

RequestQueue requestQueue = Volley.newRequestQueue(this);

requestQueue.add(stringRequest);
}

private String imageToString(Bitmap bitmap) {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, byteArrayOutputStream);
byte[] imgBytes = byteArrayOutputStream.toByteArray();
return Base64.encodeToString(imgBytes, Base64.DEFAULT);
}

最佳答案

我已经实现了文件上传,但你可以通过调整代码将其用于图片上传

我使用了以下依赖

 implementation 'net.gotev:uploadservice:2.1'

现在我们启动一个 Intent 来选择要上传的文件或图片

 public void launchIntent()

{

Intent chooseintent = new Intent();

//如果要上传图片指定为"image/*"

    chooseintent.setType("application/*");

chooseintent.setAction(Intent.ACTION_GET_CONTENT);



startActivityForResult(Intent.createChooser(chooseintent, "Select file"), Constants.CHOOSE_FILE_STAFF);



}

@Override

public void onActivityResult(int requestCode,int resultCode,Intent data)

{

super.onActivityResult(requestCode, resultCode, data);

if (requestCode == Constants.CHOOSE_FILE_STAFF && resultCode == RESULT_OK && data != null && data.getData() != null) {

stafffilePath = data.getData();

uploadFile(stafffilePath,"staff");

}



}
public void uploadFile(Uri path,String type)

{

String fullpath = FilePath.getPath(UploadActivity.this,path);





if (fullpath == null) {



Toast.makeText(this, "Please move your file in the internal storage and retry", Toast.LENGTH_LONG).show();

}

else

{

try {

String uploadId = UUID.randomUUID().toString();

singleUploadBroadcastReceiver.setDelegate(UploadActivity.this);

singleUploadBroadcastReceiver.setUploadID(uploadId);

//这里我从路径中获取文件名以检查文件上传

            String fpath[] = fullpath.split("/");

String exactfilename = fpath[fpath.length-1];

String efilename[] = exactfilename.split("\\.");

String ext = efilename[efilename.length-1];

//我在这里尝试上传excel文件,所以我正在检查文件是否是excel

            if(ext.equals("xls") || ext.equals("xlt") || ext.equals("xlm") || ext.equals("xlsx") || ext.equals("xlsm") || ext.equals("xltm") || ext.equals("xlsb") || ext.equals("xla") || ext.equals("xlam") || ext.equals("xll") ||ext.equals("xlw")) {



//Creating a multi-part request



new MultipartUploadRequest(this, uploadId, Constants.UPLOAD_FILE)

.addFileToUpload(fullpath, "filedata") //Adding file

.addParameter("name", type)

.addParameter("email", email)//Adding text parameter to the request

.setMaxRetries(2)

.startUpload(); //Starting the upload

}

else

{



AlertDialog.Builder builder = new AlertDialog.Builder(UploadActivity.this);

builder.setMessage("Please upload a Excel file").setPositiveButton("ok",null).create().show();



}



} catch (Exception exc) {

Toast.makeText(this, exc.getMessage(), Toast.LENGTH_SHORT).show();

}

}

}

有关更多信息,请单击 here

关于android - 在android中使用volley将图片上传到node.js后端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46053789/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com