title: Image upload to node.js backend using volley in android
body: <p>Am trying to upload an image using volley in android and node.js backend. But when i log the file from backend, its undefined. The app also stops working , it closes immediately. How can i solve this and upload an image to the backend? Thanks in advance. Am new to android.</p>
  
  <p>This is the backend</p>
  
  <pre><code> app.post("/upload", multer({storage: storage}).single('bitmap'), (req, res) =&gt; {
      // 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 =&gt; {
              res.send({"result": result[0], "status": result[1].statusCode});
  
          }).catch(err =&gt; {
  
          });
  });
  </code></pre>
  
  <p>This is the main class</p>
  
  <pre><code>@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::---&gt;" + 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&lt;String&gt;() {
                  @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&lt;String, String&gt; getParams() throws AuthFailureError {
  
              String image = imageToString(bitmap);
  
  
  
              Map&lt;String, String&gt; params = new Hashtable&lt;String, String&gt;();
  
  
              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);
  }
  </code></pre>