Android 图像上传成功,但它是base64字符串,但multer需要一个文件。我怎样才能解决这个问题

Android 图像上传成功,但它是base64字符串,但multer需要一个文件。我怎样才能解决这个问题,android,android-volley,nodes,image-uploading,multer,Android,Android Volley,Nodes,Image Uploading,Multer,我正在尝试在android和node.js后端使用截击上传图像。图像以base64字符串的形式出现,但multer需要一个文件。我该怎么办?我想上传图像到一个文件夹,并张贴到数据库的url 这是未定义req.file的后端 app.post("/upload", multer({storage: storage}).single('bitmap'), (req, res) => { // console.log(req.body); console.log(req.fil

我正在尝试在android和node.js后端使用截击上传图像。图像以base64字符串的形式出现,但multer需要一个文件。我该怎么办?我想上传图像到一个文件夹,并张贴到数据库的url

这是未定义req.file的后端

 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);
}
@覆盖
公共void onClick(视图v){
开关(v.getId()){
案例R.id.按钮选择:
showPictureDialog();
打破
案例R.id.buttonUpload:
上传图像();
打破
}
}
私有void showPictureDialog(){
AlertDialog.Builder pictureDialog=新建AlertDialog.Builder(此);
pictureDialog.setTitle(“选择操作”);
字符串[]pictureDialogItems={
“从图库中选择照片”,
“从相机捕捉照片”};
pictureDialog.setItems(pictureDialogItems,
新建DialogInterface.OnClickListener(){
@凌驾
public void onClick(DialogInterface dialog,int which){
开关(哪个){
案例0:
选择Romgallary()的照片;
打破
案例1:
从照相机拍摄照片();
打破
}
}
});
pictureDialog.show();
}
public void ChoosePhotoofRomgallary(){
Intent gallerycontent=新意图(Intent.ACTION\u PICK,
MediaStore.Images.Media.EXTERNAL\u CONTENT\u URI);
startActivityForResult(画廊内容、画廊);
}
私人照相/摄像机(){
意向意向=新意向(MediaStore.ACTION\u IMAGE\u CAPTURE);
startActivityForResult(意图、摄像机);
}
@凌驾
ActivityResult上的公共void(int请求代码、int结果代码、意图数据){
super.onActivityResult(请求代码、结果代码、数据);
if(resultCode==此.RESULT\u已取消){
返回;
}
if(requestCode==GALLERY){
如果(数据!=null){
Uri contentURI=data.getData();
试一试{
位图=MediaStore.Images.Media.getBitmap(this.getContentResolver(),contentURI);
Log.e(“图像”,imageToString(位图));
设置图像位图(位图);
}捕获(IOE异常){
e、 printStackTrace();
}
}
}else if(请求代码==摄像机){
位图缩略图=(位图)数据.getExtras().get(“数据”);
设置图像位图(缩略图);
Toast.makeText(MainActivity.this,“图像已保存!”,Toast.LENGTH_SHORT.show();
}
}
公共字符串保存图像(位图myBitmap){
ByteArrayOutputStream字节=新建ByteArrayOutputStream();
myBitmap.compress(Bitmap.CompressFormat.JPEG,90,字节);
文件目录=新文件(
getExternalStorageDirectory()+IMAGE\u目录);
如果(!wallperDirectory.exists()){
wallperDirectory.mkdirs();
}
试一试{
文件f=新文件(文件夹,Calendar.getInstance()
.getTimeInMillis()+“.jpg”);
f、 createNewFile();
FileOutputStream fo=新的FileOutputStream(f);
fo.write(bytes.toByteArray());
MediaScannerConnection.scanFile(此,
新字符串[]{f.getPath()},
新字符串[]{“image/jpeg”},空);
fo.close();
Log.d(“标记”,“保存的文件::-->”+f.getAbsolutePath());
返回f.getAbsolutePath();
}捕获(IOE1异常){
e1.printStackTrace();
}
返回“”;
}
私有void uploadImage(){
final ProgressDialog loading=ProgressDialog.show(这是“正在上载…”,“请稍候…”,false,false);
StringRequest StringRequest=新建StringRequest(Request.Method.POST,URL\u UPLOAD,
新的Response.Listener(){
@凌驾
公共void onResponse(字符串s){
loading.dispose();
Toast.makeText(MainActivity.this,s,Toast.LENGTH_LONG.show();
}
},
新的Response.ErrorListener(){
@凌驾
公共错误响应(截击错误截击错误){
loading.dispose();
Toast.makeText(MainActivity.this,volleyError.getMessage().toString(),Toast.LENGTH_LONG.show();
}
}) {
@凌驾
受保护的映射getParams()引发AuthFailureError{
字符串图像=图像字符串(位图);
Map params=新哈希表();
参数put(按键图像,图像);
返回参数;
}
};
RequestQueue RequestQueue=Volley.newRequestQueue(this);
添加(stringRequest);
}
私有字符串imageToString(位图){
ByteArrayOutputStream ByteArrayOutputStream=新建ByteArrayOutputStream();
compress(bitmap.CompressFormat.JPEG,100,byteArrayOutputStream);
字节[]imgBytes=byteArrayOutputStream.toByteArray();
返回Base64.encodeToString(imgBytes,Base64.DEFAULT);
}

为什么将其作为base64字符串发送?在截击中,它们必须转换为字符串。你还有其他方法吗?请分享也许这可以帮助你使用截击发送多部分我会尝试,但我后来找到了解决办法,我不得不将base64改回图像并使用文件系统将其写入文件夹为什么你将其作为base64字符串发送?在截击中,它们必须转换为字符串。你还有其他的方法吗?请分享也许这可以帮助你使用截击发送多部分我会尝试,但我后来找到了解决办法,我不得不将base64改回图像,并使用文件系统将其写入文件夹