0

I am trying to upload image using android app to "node.js formidable". The code i am using is working with php upload functionality but not working with formidable. Node.js formidable is working if i am uploading files using HTML form.

here is my code.

Android Side

String fileName = path;

    HttpURLConnection conn = null;
    DataOutputStream dos = null; 
    String lineEnd = "\r\n";
    String twoHyphens = "--";
    String boundary = "*****";
    int bytesRead, bytesAvailable, bufferSize;
    byte[] buffer;
    int maxBufferSize = 1 * 1024 * 1024;
    File sourceFile = new File(path);
    if (!sourceFile.isFile()) {
     Log.e("uploadFile", "Source File Does not exist");
     return 0;
    }
        try { // open a URL connection to the Servlet
         FileInputStream fileInputStream = new FileInputStream(sourceFile);
         URL url = new URL(upLoadServerUri);
         conn = (HttpURLConnection) url.openConnection(); // Open a HTTP  connection to  the URL

         conn.setDoInput(true); // Allow Inputs
         conn.setDoOutput(true); // Allow Outputs
         conn.setUseCaches(false); // Don't use a Cached Copy
         conn.setRequestMethod("POST");
         conn.setRequestProperty("Connection", "Keep-Alive");
         conn.setRequestProperty("ENCTYPE", "multipart/form-data");
         conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);
         //conn.addRequestProperty("action", URLEncoder.encode("uploadPic","UTF-8"));
         conn.setRequestProperty("uploaded_file", fileName);
         dos = new DataOutputStream(conn.getOutputStream());

         dos.writeBytes(twoHyphens + boundary + lineEnd);
         dos.writeBytes("Content-Disposition: form-data; name=\"uploaded_file\";filename=\""+ name + "\"" + lineEnd);

         dos.writeBytes(lineEnd);

         bytesAvailable = fileInputStream.available(); // create a buffer of  maximum size

         bufferSize = Math.min(bytesAvailable, maxBufferSize);
         buffer = new byte[bufferSize];

         // read file and write it into form...
         bytesRead = fileInputStream.read(buffer, 0, bufferSize); 

         while (bytesRead > 0) {
           dos.write(buffer, 0, bufferSize);
           bytesAvailable = fileInputStream.available();
           bufferSize = Math.min(bytesAvailable, maxBufferSize);
           bytesRead = fileInputStream.read(buffer, 0, bufferSize);              
          }

         // send multipart form data necesssary after file data...
         dos.writeBytes(lineEnd);
         dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);

         // Responses from the server (code and message)
         serverResponseCode = conn.getResponseCode();
         String serverResponseMessage = conn.getResponseMessage();

         Log.i("uploadFile", "HTTP Response is : " + serverResponseMessage + ": " + serverResponseCode);
         if(serverResponseCode == 200){

         }   

         //close the streams //
         fileInputStream.close();
         dos.flush();
         dos.close();

    } catch (MalformedURLException ex) { 

        ex.printStackTrace();
        //Toast.makeText(UploadImageDemo.this, "MalformedURLException", Toast.LENGTH_SHORT).show();
        Log.e("Upload file to server", "error: " + ex.getMessage(), ex); 
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } 

Node.js Server Side

 router.post('/upload', function(req, res) {

        var form = new formidable.IncomingForm();
        form.uploadDir ="Directory";
        form.keepExtensions = true;
        form.parse(req, function(err, fields, files) {

                   res.writeHead(200, {'content-type': 'text/plain'});
                   res.write('received upload:\n\n');
                   res.end(util.inspect({fields: fields, files: files}));
                   });
        form.on('file', function(name, file) {
                console.log(file.path);
                });
     });

It is not even giving any error.

I have searched a lot but nothing worked for body parser, fs, multiparty etc.

Prem Tomar
  • 79
  • 10

2 Answers2

1

Finally i found the solution Here this is working with node.js upload functions.

    HttpParams params = new BasicHttpParams();
    params.setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);
    mHttpClient = new DefaultHttpClient(params);

    try {

        HttpPost httppost = new HttpPost("http://5.189.142.171:3000/upload");

        MultipartEntity multipartEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);  
        multipartEntity.addPart("Title", new StringBody("Title"));
        multipartEntity.addPart("Nick", new StringBody("Nick"));
        multipartEntity.addPart("Email", new StringBody("Email"));
        //multipartEntity.addPart("Description", new StringBody(Settings.SHARE.TEXT));
        multipartEntity.addPart("Image", new FileBody(new File(path)));
        httppost.setEntity(multipartEntity);

        mHttpClient.execute(httppost, new PhotoUploadResponseHandler());

    } catch (Exception e) {
        //Log.e(ServerCommunication.class.getName(), e.getLocalizedMessage(), e);
        e.printStackTrace();
    }
Community
  • 1
  • 1
Prem Tomar
  • 79
  • 10
  • 1
    Nice! I was assuming that there should be a higher level multipart API that you can use in Java. – simo Nov 04 '15 at 13:23
0

Here is an example of working nodejs server using formidable:

router.post('/upload', function (req, res) {
  var form = new formidable.IncomingForm()
  form.parse(req, function (err, fields, files) {})
  form.onPart = function (part) {
    var fpath = '/absolute/path/to/upload/folder/'
    part.pipe(fs.createWriteStream(fpath + part.name))
  }
  form.on('end', function () {
    res.end('END')
  })
})

This will pipe each file you are uploading to a file stream. At the end you can return some message to the user.

simo
  • 15,078
  • 7
  • 45
  • 59
  • Not Working. Android app not even reaching to that URL. – Prem Tomar Nov 04 '15 at 11:48
  • Well, I'm not an Android expert, but I can assure you that the server example that I gave you is working and correct. – simo Nov 04 '15 at 12:36
  • Yes, it will work with html form if we use it with html forms but i want it to work with android upload method. Anyway thank you for you precious time. – Prem Tomar Nov 04 '15 at 12:42
  • There is an actual [RFC specification](https://www.ietf.org/rfc/rfc2388.txt) for encoding multipart bodies, so it doesn't matter in what language or scenario you are generating the multipart body - it should confront to that spec. At first glance looking at your Java code, you seems to be on the right way. You are most probably not generating the multipart body correctly. – simo Nov 04 '15 at 12:55