Android 图像上传成功,但它是base64字符串,但multer需要一个文件。我怎样才能解决这个问题
我正在尝试在android和node.js后端使用截击上传图像。图像以base64字符串的形式出现,但multer需要一个文件。我该怎么办?我想上传图像到一个文件夹,并张贴到数据库的url 这是未定义req.file的后端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
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改回图像,并使用文件系统将其写入文件夹