2015-11-04 12 views
0

Я пытаюсь загрузить изображение с помощью приложения для Android в "node.js грозное". Код, который я использую, работает с функциональностью загрузки php, но не работает с грозным. Node.js formidable работает, если я загружаю файлы с использованием формы HTML.Как загрузить изображение в массив с помощью android

вот мой код.

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

Он даже не дает каких-либо ошибок.

Я искал много, но ничего не работает для синтаксического анализа тела, фс, многопартийности и т.д.

ответ

0

Вот пример работы сервера nodejs с помощью 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') 
    }) 
}) 

Это будет труба каждого файла вы загрузка в поток файлов. В конце вы можете вернуть сообщение пользователю.

+0

Не работает. Android-приложение даже не доходит до этого URL-адреса. –

+0

Ну, я не специалист по Android, но могу вас заверить, что пример сервера, который я вам дал, работает и исправляется. – simo

+0

Да, он будет работать с формой html, если мы будем использовать его с форматами html, но я хочу, чтобы он работал с методом андроидной загрузки. В любом случае, спасибо за драгоценное время. –

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

Ницца! Я предполагал, что должен быть API-интерфейс более высокого уровня, который можно использовать в Java. – simo