2017-02-15 1 views
3

JBossサーバーからアンドロイドにファイルのリスト(私の場合はイメージ)をアップロードします。 は、私は以下の書かれたコードでそうやって:アンドロイド側でokaportを使用して、resteasyからandroidに送信されたマルチパート応答を読み取るにはどうすればよいですか?

@GET 
@Path("/report/{filename}") 
@Produces({MediaType.MULTIPART_FORM_DATA}) 
public MultipartFormDataOutput getReport(@PathParam("filename") String filename, @Context HttpServletRequest request) { 
    try { 
     String token = request.getHeader("Authorization"); 
     List<File> file = processImage.getImage(filename,token); 
     MultipartFormDataOutput output = new MultipartFormDataOutput(); 
     for(File image: file){ 
     System.out.println("class of this" +image + "MMMM" +image.exists()); 
     output.addPart(image, new MediaType("image","jpg")); 
     } 
     return output; 

    } ..... 
     ....... 
} 

私は、応答(マルチパート形式のファイル)を読みたいです。私は接続を行うためにokHttpを使用しています。 インターネットでたくさんの検索を行っています。マルチパートレスポンスを読むために以下のコードを試しましたが、うまくいきません。ストリームから何も読んでいないようです。

ByteArrayDataSource ds = new ByteArrayDataSource(response.body().byteStream(), "multipart/form-data"); 
      MimeMultipart multipart = new MimeMultipart(ds); 
      BodyPart jsonPart = multipart.getBodyPart(0); 

      System.out.println("Response body = " + jsonPart.getInputStream()); 
      File reportFile = new File(Environment.getExternalStorageDirectory() + File.separator + "downloadedFile.jpg"); 
      InputStream is = jsonPart.getInputStream(); 
      FileOutputStream fileOutputStream = null; 
      try { 
       fileOutputStream = new FileOutputStream(reportFile); 
       byte[] buffer = new byte[MEGABYTE]; 
       int bufferLength = 0; 

       while ((bufferLength = is.read(buffer)) > 0) { 
        fileOutputStream.write(buffer, 0, bufferLength); 
       } 
       is.close(); 
       fileOutputStream.close(); 
        ....... 
      } 

誰でもこの問題を解決できますか?私は2日からここで立ち往生しています。私は間違って何をしています。

+0

は、あなたがこのライン出力を表示することができますするSystem.out.println( "レスポンスボディ=" + jsonPart.getInputStream()); –

+0

http://www.coderzheaven.com/2011/08/16/how-to-upload-multiple-files-in-one-request-along-with-other-string-parameters-in-android/またはhttp: //stackoverflow.com/questions/32984323/upload-multiple-image-file-using-httpurlconnection –

+0

これを試してくださいhttp://stackoverflow.com/questions/35622676/image-upload-using-okhttp/35622812#35622812 –

答えて

1

:一緒に来るかもしれない他の人のために、私は私のMavenのpom.xmlにこれを追加する必要がありました

  • は、非同期タスクを作成しますが、バックグラウンドで実行するよう
  • 使用okhttp3.Requestはokhttp3.ResponseBodyからレスポンスボディを取得し、InputStreamReを使用すると
  • okHttp3レスポンスにリクエストを送信し、応答を保存するためにOkHttpClientを作成し、要求
  • を作成しますaderおよびBufferedReaderを使用してファイルを読み取ります。次のような

何か作業をする必要があります:

private class FileTask extends AsyncTask<Void, Void, Void> { 
    private File file = null; 
    @Override 
    protected Void doInBackground(Void... params) { 

     okhttp3.Request request = new okhttp3.Request.Builder() 
       .url("Your URL for getReport()") 
       .get() 
       .build(); 
     OkHttpClient okHttpClient = new OkHttpClient.Builder(). 
         connectTimeout(80, TimeUnit.SECONDS) 
         .writeTimeout(80, TimeUnit.SECONDS) 
         .readTimeout(80, TimeUnit.SECONDS) 
         .build(); 


     try { 
      Response response = okHttpClient.newCall(request).execute(); 
      okhttp3.ResponseBody in = response.body(); 
      InputStream is = in.byteStream(); 
      InputStreamReader inputStreamReader = new InputStreamReader(is); 
      BufferedReader buffReader = new BufferedReader(inputStreamReader); 

      file = new File(Environment.getExternalStorageDirectory() + File.separator + "filename.txt"); //Your output file 
      OutputStream output = new FileOutputStream(file); 
      BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(output); 


      String line=buffReader.readLine(); 
      while ((line=buffReader.readLine()) != null) { 
       output.write(line.getBytes()); 
       output.write('\n'); 
      } 
      buffReader.close(); 
      output.close(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Void aVoid) { 
     //do post execution steps 
     } 
    } 
} 
0

はこれを試してみてください。

//first you should convert image into bytearray 


VolleyMultipartRequest multipartRequest = new VolleyMultipartRequest(Request.Method.POST, url, new Response.Listener<NetworkResponse>() { 
     @Override 
     public void onResponse(NetworkResponse response) { 

      System.out.println(" response"+response.data); 


      String resultResponse = new String(response.data); 
      System.out.println("------------- response-----------------"+resultResponse); 

      try { 
       JSONObject jsonObject = new JSONObject(resultResponse); 
       sStatus = jsonObject.getString("status"); 


       } else { 

       } 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 
      dialog.dismiss(); 
     } 
    }, new Response.ErrorListener() { 
     @Override 
     public void onErrorResponse(VolleyError error) { 

      dialog.dismiss(); 

      NetworkResponse networkResponse = error.networkResponse; 
      String errorMessage = "Unknown error"; 
      if (networkResponse == null) { 
       if (error.getClass().equals(TimeoutError.class)) { 
        errorMessage = "Request timeout"; 
       } else if (error.getClass().equals(NoConnectionError.class)) { 
        errorMessage = "Failed to connect server"; 
       } 
      } else { 
       String result = new String(networkResponse.data); 
       try { 
        JSONObject response = new JSONObject(result); 
        String status = response.getString("status"); 
        String message = response.getString("message"); 

        Log.e("Error Status", status); 
        Log.e("Error Message", message); 

        if (networkResponse.statusCode == 404) { 
         errorMessage = "Resource not found"; 
        } else if (networkResponse.statusCode == 401) { 
         errorMessage = message + " Please login again"; 
        } else if (networkResponse.statusCode == 400) { 
         errorMessage = message + " Check your inputs"; 
        } else if (networkResponse.statusCode == 500) { 
         errorMessage = message + " Something is getting wrong"; 
        } 
       } catch (JSONException e) { 
        e.printStackTrace(); 
       } 
      } 
      Log.i("Error", errorMessage); 
      error.printStackTrace(); 
     } 
    }) { 

     @Override 
     protected Map<String, String> getParams() { 
      Map<String, String> params = new HashMap<>(); 
      params.put("id",ID); 
      System.out.println("id---------------"+ID); 
      return params; 
     } 

     @Override 
     protected Map<String, DataPart> getByteData() { 
      Map<String, DataPart> params = new HashMap<>(); 
      params.put("image",new DataPart("imnage.jpg", byteArray)); 

      return params; 
     } 
    } 

    AppController.getInstance().addToRequestQueue(multipartRequest); 

} 
+0

あなたの応答は、apache httpclientに依存するように見えるVolleyMultipartRequestを使用しています。問題は、httpclientではなくokhttpを使ってこれを行う方法でした。 –

0

あなたはおそらくでsetLevel(HttpLoggingInterceptor.Level.BODY)とHttpLoggingInterceptorを使用していますか?あなたのコードを使用して、マルチパートレスポンスを正常に解析しました。しかし、レベルをHEADERSからBODYに変更すると、そのコードは機能しなくなり、ストリームから何も読み取っていないかのように動作します。私はすでに問題を報告しました:https://github.com/square/okhttp/issues/3269

ところで、OkHttpを使ってマルチパートボディを解析できるようにサンプルコードをくれてくれてありがとう。あなたは次の操作を行うことができます

<dependency> 
     <groupId>com.sun.mail</groupId> 
     <artifactId>javax.mail</artifactId> 
     <version>1.5.6</version> 
    </dependency> 
+0

私は解決策を得ました。すぐに投稿されます – Yoda

関連する問題