2015-11-04 67 views
0

我嘗試使用Android應用程序,以「Node.js的強大」上傳圖像厲害。我使用的代碼正在與PHP的上傳功能,但與強大的工作。如果我使用HTML表單上傳文件,Node.js強大工作。如何上傳圖像採用了android

這裏是我的代碼。

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

它甚至沒有給予任何錯誤。

我尋覓了很多,但沒有奏效身體解析器,FS,多方等等

回答

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

這將管道的每個文件都上傳到文件流。最後,您可以向用戶返回一些消息。

+0

不工作。 Android應用程式甚至沒有到達該網址。 –

+0

嗯,我不是一位Android專家,但我可以向你保證,那我給你的服務器實例的工作和正確的。 – simo

+0

是的,它會與HTML表單的工作,如果我們用HTML表單使用它,但我希望它與Android上傳方法工作。無論如何謝謝你寶貴的時間。 –

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

不錯!我假設應該有一個更高級別的multipart API,您可以在Java中使用。 – simo