I have tried many ways to upload an image to my node server but none of them worked. Finally, I came across the Ion library (https://github.com/koush/ion) to upload images but this is also not working. It reaches onCompleteListener but the image is not getting uploaded to MongoDB. It works fine in Postman but not in android. Here is the node code
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!"
});
});
Here is my android code
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
}
});
}
Any other method would also be appreciated.