2017-02-15 35 views
3

Я хочу загрузить список файлов (изображений в моем случае) с сервера JBoss на Android. Я делаю так в коде ниже:Как читать многостраничный ответ, отправленный из resteasy в android, используя okHttp?

@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; 

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

На Android стороны я хочу прочитать ответ (файлы в многочастной форме). Я использую 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 ("тело Response =" + 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

Вы можете сделать следующее:

  • Создайте задачу асинхронной, чтобы работать в фоновом режиме
  • используйте okhttp3.Request, чтобы создали запрос
  • Создать OkHttpClient отправить запрос и сохранить ответ в okHttp3 ответ
  • Затем получить тело ответа от okhttp3.ResponseBody и использовать InputStreamRe 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

В вашем ответе используется VolleyMultipartRequest, который зависит от apache httpclient. Вопрос в том, как это сделать, используя okhttp, а не httpclient. –

0

Вы, возможно, с помощью HttpLoggingInterceptor с setLevel (HttpLoggingInterceptor.Level.BODY)? Я использовал ваш код для успешного анализа множественного ответа. Но как только я изменяю уровень от HEADERS до BODY, этот код больше не работает и действует так, как будто он ничего не читает из потока. Я уже сообщал об этой проблеме: https://github.com/square/okhttp/issues/3269

Кстати, спасибо, что дал мне образец кода, который позволил мне разобрать многочастное тело с помощью OkHttp. Для тех, кто может прийти вместе, я должен был добавить это к моему Maven pom.xml:

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

Спасибо, я получил решение. Скоро будет публикация – Yoda