2017-01-13 5 views
1

AndroidアプリケーションからBitmapをNodeJSサーバーにアップロードしようとしています。私のビットマップは、同じ(POST)メッセージでアップロードされなければならないいくつかのデータ(Json)を持っています。私はそれが可能であることを見た:Android:jsonで画像をアップロード

  • マルチフォームデータ。
  • アプリ側でイメージをエンコード(イメージを文字列に変換)し、サーバー側でデコードします。

良い方法はありますか?そのようなアップロードを実行するための良いガイドに精通している人はいますか?

+0

イメージエンコーディングは非常に大きな文字列を作成する可能性があり、私の意見ではマルチパートフォームデータが元のイメージよりも大きくなります。 –

+0

@ Boldijar Paul私はMultipartEntityオブジェクトを使うべきですか、通常のDataOutputStreamだけを使うべきですか? –

+0

自分ですべてをコーディングすることができます。または、このサイト全体の準備ができたコードを見つけてください。または、ライブラリを使用します。 jsonを使用したい場合(あなたが言うように)、multipartを使うことはできず、画像データbase64をエンコードしなければならず、サイズは30%増加します。 – greenapps

答えて

0

ありがとうございました。これは、マルチパートアップロードのために書いたコードです(いくつかの回答のマージ)。コードに問題がある場合は、教えてください。サーバ側(NodeJS)については

// create a url object 
    URL url = new URL(mGlobalUrl + localUrl); 
    HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 

    conn.setDoInput(true); 
    conn.setDoOutput(true); 
    conn.setUseCaches(false); 

    conn.setRequestMethod("POST"); 
    conn.setRequestProperty("Connection", "Keep-Alive"); 
    conn.setRequestProperty("User-Agent", "Android Multipart HTTP Client 1.0"); 
    conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary); 

    DataOutputStream outputStream = new DataOutputStream(conn.getOutputStream()); 

    //--start-- 
    //Deal with data 
    outputStream.writeBytes(twoHyphens + boundary + lineEnd);   //key 
    outputStream.writeBytes("Content-Disposition: form-data; name=\"key\"" + lineEnd); 
    outputStream.writeBytes(lineEnd); 
    outputStream.writeBytes(value); //value 
    outputStream.writeBytes(lineEnd); 

    //Deal with image 
    outputStream.writeBytes(twoHyphens + boundary + lineEnd);   //key 
    outputStream.writeBytes("Content-Disposition: form-data; name=\"uploadFile\"; filename=\"" + "image1" + "\"" + lineEnd); 
    //outputStream.writeBytes("Content-Type: " + fileMimeType + lineEnd); 
    outputStream.writeBytes("Content-Transfer-Encoding: binary" + lineEnd); 
    outputStream.writeBytes(lineEnd); 

    FileInputStream fileInputStream = new FileInputStream(imagePath); //value 
    int bytesAvailable = fileInputStream.available(); 
    int bufferSize = Math.min(bytesAvailable, maxBufferSize); 
    byte[] buffer = new byte[bufferSize]; 

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

    outputStream.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd); 
    //--end-- 

    // receive response as inputStream 
    int responseCode = conn.getResponseCode(); 
    if (responseCode == HttpsURLConnection.HTTP_OK) { 
     inputStream = new BufferedInputStream(conn.getInputStream()); 

     // convert input stream to string 
     if (inputStream != null) { 
      result = convertInputStreamToString(inputStream); 
     } 
     else { 

      Log.d(TAG, "sendPostRequest: Error - input stream is null"); 
      result = "{}"; 
     } 
    } 

    fileInputStream.close(); 
    outputStream.flush(); 
    outputStream.close(); 
    conn.disconnect(); 

私は強敵モジュールを使用(私はそれは廃止されているかどうかわからない)、あなたはこのモードhereに関するいくつかのより多くの情報を見つけることができます。

upload_image = function(req, res, next) { 

//create new incoming form object 
var form = new formidable.IncomingForm(); 

//parse the request using formidable module 
form.parse(req, function(error, fields, files) { 

    //check if error occurred during the parse 
    if (error) { 
     ...some code 
     return; 
    } 

    //save the data received in the request 
    ...some code 
}); 

//check for errors during the transmission 
form.on('error', function(err) { 
    ...some code 
    return; 
}); 

//check for the end of the transmission 
form.on('end', function(error, fields, files) { 
    //save the temporary location of the uploaded image file 
    var temp_path = this.openedFiles[0].path; 

    //save the file name of the uploaded image file 
    var file_name = this.openedFiles[0].name; 

    //save the file 
    ...some code 

    //update the database 
    ...some code 
}; 
+0

ちょっと@MaxZあなたはイメージをどのように扱うのかをポストしてください。多くのライブラリが存在するため、どのライブラリを使用しているかを知ることはうれしいことですが、そのほとんどは廃止されたメソッドを持ち、アンドロイドのネイティブと競合しています。 – nsgulliver

+0

@nsgulliver完了。 –