如何使用android将图像上传到强大

时间:2015-11-04 11:12:53

标签: android node.js http httpurlconnection formidable

我正在尝试使用Android应用程序将图像上传到“node.js强大”。我正在使用的代码正在使用php上传功能,但没有使用强大的功能。如果我使用HTML表单上传文件,Node.js强大的工作正在运行。

这是我的代码。

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服务器端

 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);
                });
     });

它甚至没有任何错误。

我已经搜索了很多但是没有用于身体解析器,fs,多方等等。

2 个答案:

答案 0 :(得分:1)

最后我找到了解决方案Here 这与node.js上传函数一起使用。

    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();
    }

答案 1 :(得分:0)

以下是使用formidable工作nodejs服务器的示例:

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')
  })
})

这会将您上传的每个文件传输到文件流。最后,您可以向用户返回一些消息。