【问题标题】:How to upload image to formidable using android如何使用android将图像上传到强大
【发布时间】:2015-11-04 11:12:53
【问题描述】:

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

这是我的代码。

Android 端

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

它甚至没有给出任何错误。

我已经搜索了很多,但对于 body parser、fs、多方等都没有任何效果。

【问题讨论】:

    标签: android node.js http httpurlconnection formidable


    【解决方案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();
        }
    

    【讨论】:

    • 不错!我假设应该有一个可以在 Java 中使用的更高级别的多部分 API。
    【解决方案2】:

    这里是一个使用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')
      })
    })
    

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

    【讨论】:

    • 不工作。 Android 应用甚至无法访问该 URL。
    • 好吧,我不是 Android 专家,但我可以向您保证,我提供给您的服务器示例运行正常且正确。
    • 是的,如果我们将它与 html 表单一起使用,它将与 html 表单一起使用,但我希望它与 android 上传方法一起使用。无论如何,感谢您宝贵的时间。
    • 有一个实际的RFC specification 用于编码多部分正文,因此生成多部分正文的语言或场景无关紧要 - 它应该符合该规范。乍一看您的 Java 代码,您似乎走在了正确的道路上。您很可能没有正确生成多部分正文。
    猜你喜欢
    • 2012-09-26
    • 2017-03-08
    • 2017-08-04
    • 2013-05-23
    • 1970-01-01
    • 2021-03-18
    • 2014-07-28
    • 1970-01-01
    相关资源
    最近更新 更多