Я пробовал много способов загрузить изображение на сервер узла, но ни один из них не сработал. Наконец, я наткнулся на библиотеку Ion (https://github.com/koush/ion), чтобы загружать изображения, но это также не работает. Он достигает onCompleteListener, но изображение не загружается в MongoDB. Он отлично работает в Postman, но не в Android. Вот код узла
const multer= require('multer');
const storage = multer.diskStorage({
destination: function(req, file, cb) {
var tok = decode(req.params.id);
// const url = req.protocol + "://" + req.get("host");
let path = './images/'+tok.email;
fs.mkdirsSync(path);
cb(null, path);
},
filename: function(req, file, cb) {
var tok = decode(req.params.id);
cb(null, tok.email +'profilePic' + file.originalname);
}
});
const upload = multer({
storage: storage,
limits: {
fileSize: 1024 * 1024 * 1
},
fileFilter: fileFilter
});
app.post('/profilepic/:id',upload.single('profilePic'),function (req,res) {
// if(!req.session.user){
// return res.status(200).send("failure@Not Authorized");
// }
var tok = decode(req.params.id);
console.log(req.file.filename);
User.updateOne({'_id': tok.id },{'profilePic':tok.email+'/'+req.file.filename}).then(result =>{
console.log(result);
if (result.n > 0) {
res.status(200).json({ message: "success" });
}else {
res.status(200).json({ message: "failure@err in Updating pic" });
}
})
.catch(error => {
res.status(200).json({
message: "failure@User not found!"
});
});
Вот мой код андроида
private void chooseImage(int imageReq) {
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, "Select Picture"), imageReq);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == PICK_IMAGE_REQUEST)
&& resultCode == RESULT_OK
&& data != null
&& data.getData() != null) {
showProgressDialog();
Uri filePath = data.getData();
Log.d(TAG,getAbsolutePath(filePath));
uploadFile(getAbsolutePath(filePath));
Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), filePath);
Bitmap lastBitmap = null;
lastBitmap = bitmap;
if (requestCode == PICK_IMAGE_REQUEST) {
Glide.with(this)
.load(bitmap)
.into(profileCoverPic);
}
}
public String getAbsolutePath(Uri uri) {
String[] projection = { MediaStore.MediaColumns.DATA };
@SuppressWarnings("deprecation")
Cursor cursor = managedQuery(uri, projection, null, null, null);
if (cursor != null) {
int column_index = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DATA);
cursor.moveToFirst();
return cursor.getString(column_index);
} else
return null;
}
private void uploadFile(String path){
Ion.with(getApplicationContext())
.load(profilePicUrl)
.setMultipartParameter("name", "source")
.setMultipartFile("profilepic", "image/jpeg", new File(path))
.asJsonObject()
.setCallback(new FutureCallback<JsonObject>() {
@Override
public void onCompleted(Exception e, JsonObject result) {
hideProgressDialog();
Log.d(TAG,"photo uploaded");
Toast.makeText(ProfileActivity.this, "Photo uploaded", Toast.LENGTH_SHORT).show();
//do stuff with result
}
});
}
Любой другой метод также будет оценен.