2016-10-05 41 views
6

Używam Retrofit do przesyłania zdjęć na mój serwer. Tutaj muszę przesłać wiele obrazów dla jednego klucza. Próbowałem z klientem Postman, że działa dobrze. Oto zrzut ekranu. enter image description hereRetrofit Przesyłanie wielu obrazów do jednego klucza

Oto pary wartości klucza dla żądania.
SurveyImage: [plik1, plik2, plik3];
PropertyImage: Plik
DRA: jsonBody

starałem się zrobić to samo z modernizacji. ale obrazy nie ładują się na serwer. Oto mój kod.
WebServicesAPI.java

public interface WebServicesAPI { 
    @Multipart 
    @POST(WebServices.UPLOAD_SURVEY) 
    Call<UploadSurveyResponseModel> uploadSurvey(@Part MultipartBody.Part surveyImage, @Part MultipartBody.Part propertyImage, @Part("DRA") RequestBody dra); 
} 

Oto metoda przesyłania plików.

private void requestUploadSurvey() { 
     File propertyImageFile = new File(surveyModel.getPropertyImagePath()); 
     RequestBody propertyImage = RequestBody.create(MediaType.parse("image/*"), propertyImageFile); 
     MultipartBody.Part propertyImagePart = MultipartBody.Part.createFormData("PropertyImage", propertyImageFile.getName(), propertyImage); 
     JSONObject requestBody = getRequestBody(); 
     RequestBody draBody = null; 
     try { 
      draBody = RequestBody.create(MediaType.parse("text/plain"), requestBody.toString(1)); 
      Log.d(TAG, "requestUploadSurvey: RequestBody : " + requestBody.toString(1)); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
     MultipartBody.Builder builder = new MultipartBody.Builder(); 
     builder.setType(MultipartBody.FORM); 
     MultipartBody surveyImage = null; 

      for (SurveyModel.PictureModel model : surveyModel.getPicturesList()) { 
       File file = new File(model.getImagePath()); 
       builder.addFormDataPart("SurveyImage", file.getName(), 
         RequestBody.create(MediaType.parse("image/*"), file)); 
      } 
      surveyImage = builder.build(); 

     final WebServicesAPI webServicesAPI = RetrofitManager.getInstance().getRetrofit().create(WebServicesAPI.class); 
     Call<UploadSurveyResponseModel> surveyResponse = null; 

      surveyResponse = webServicesAPI.uploadSurvey(MultipartBody.Part.createFormData("SurveyImage", "SurveyImage", surveyImage), propertyImagePart, draBody); 

     surveyResponse.enqueue(this); 

     Log.d(TAG, "requestUploadSurvey: sent the request"); 
    } 

Pomóż mi z tym.

+0

wysłać SurveyModel sir –

Odpowiedz

4

Możemy użyć tablicy MultipartBody.Part, aby przesłać tablicę obrazów do jednego klucza. Oto rozwiązanie
WebServicesAPI

public interface WebServicesAPI { 
    @Multipart 
    @POST(WebServices.UPLOAD_SURVEY) 
    Call<UploadSurveyResponseModel> uploadSurvey(@Part MultipartBody.Part[] surveyImage, @Part MultipartBody.Part propertyImage, @Part("DRA") RequestBody dra); 
} 

Oto metoda przesyłania plików.

private void requestUploadSurvey() { 
    File propertyImageFile = new File(surveyModel.getPropertyImagePath()); 
    RequestBody propertyImage = RequestBody.create(MediaType.parse("image/*"), propertyImageFile); 
    MultipartBody.Part propertyImagePart = MultipartBody.Part.createFormData("PropertyImage", propertyImageFile.getName(), propertyImage); 

    MultipartBody.Part[] surveyImagesParts = new MultipartBody.Part[surveyModel.getPicturesList().size()]; 

    for (int index = 0; index < surveyModel.getPicturesList().size(); index++) { 
     Log.d(TAG, "requestUploadSurvey: survey image " + index + " " + surveyModel.getPicturesList().get(index).getImagePath()); 
     File file = new File(surveyModel.getPicturesList().get(index).getImagePath()); 
     RequestBody surveyBody = RequestBody.create(MediaType.parse("image/*"), file); 
     surveyImagesParts[index] = MultipartBody.Part.createFormData("SurveyImage", file.getName(), surveyBody); 
    } 

    final WebServicesAPI webServicesAPI = RetrofitManager.getInstance().getRetrofit().create(WebServicesAPI.class); 
    Call<UploadSurveyResponseModel> surveyResponse = null; 
    if (surveyImagesParts != null) { 
     surveyResponse = webServicesAPI.uploadSurvey(surveyImagesParts, propertyImagePart, draBody); 
    } 
    surveyResponse.enqueue(this); 
} 
+1

Nie mogę przesłać wielu obrazów za pomocą 'MultipartBody.Part []', zawsze przesyła tylko ostatni obraz w tablicy. czy możesz jasno określić, gdzie dokładnie używasz klucza do macierzy obrazów. Z góry dziękuję. –

+0

Upewnij się, że tworzysz tylko jedno odwołanie do tablicy i dodaj wszystkie obrazy do tej tablicy. Przejrzyj metodę uploadSurvey w WebServicesAPI dla odniesienia. – Kartheek

+0

Spróbuję. dzięki. –

0

Użyj tego https://github.com/gotev/android-upload-service, aby przesłać wiele obrazów na serwer. Użyłem go i działa idealnie na ponad 100 obrazach.

+0

Czy to możliwe przy modernizacji.? – Kartheek

+0

Ma własne połączenia, aby przesłać obraz, który używa OKt, więc musisz przekazać tylko adres URL, w którym chcesz przesłać obraz. –

+0

to jest pomocne? –

0

Pierwszy parametr @method createFormData klasy MultipartBody.Part jest ciągiem znaków, który jest „klucz” lub nazwa wejścia, można przekazać ciąg images[] w postaci tablicy, a później można obsługiwać go z język backend i pętli nad nim, aby uzyskać wszystkie obrazy w położeniu (i)

check example

3

jest to najlepszy sposób na wysyłanie danych z obrazu ... próbowałem dużo. Ale to najlepsze rozwiązanie na świecie.

private void uploadMultiFile() { 
    progressDialog.show(); 

    ArrayList<String> filePaths = new ArrayList<>(); 
    filePaths.add("storage/emulated/0/DCIM/Camera/IMG_20170802_111432.jpg"); 
    filePaths.add("storage/emulated/0/Pictures/WeLoveChat/587c4178e4b0060e66732576_294204376.jpg"); 
    filePaths.add("storage/emulated/0/Pictures/WeLoveChat/594a2ea4e4b0d6df9153028d_265511791.jpg"); 

    MultipartBody.Builder builder = new MultipartBody.Builder(); 
    builder.setType(MultipartBody.FORM); 

    builder.addFormDataPart("user_name", "Robert"); 
    builder.addFormDataPart("email", "[email protected]"); 

    // Map is used to multipart the file using okhttp3.RequestBody 
    // Multiple Images 
    for (int i = 0; i < filePaths.size(); i++) { 
     File file = new File(filePaths.get(i)); 
     builder.addFormDataPart("file[]", file.getName(), RequestBody.create(MediaType.parse("multipart/form-data"), file)); 
    } 

    File file = new File(""); 
    MultipartBody requestBody = builder.build(); 
    Call<ResponseBody> call = uploadService.uploadMultiFile(requestBody); 
    call.enqueue(new Callback<ResponseBody>() { 
     @Override 
     public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) { 

      Toast.makeText(MainActivity.this, "Success " + response.message(), Toast.LENGTH_LONG).show(); 
      Toast.makeText(MainActivity.this, "Success " + response.body().toString(), Toast.LENGTH_LONG).show(); 

      progressDialog.dismiss(); 

     } 

     @Override 
     public void onFailure(Call<ResponseBody> call, Throwable t) { 
      progressDialog.dismiss(); 
      Log.d(TAG, "Error " + t.getMessage()); 
     } 
    }); 


} 

i jest to interfejs

@POST("/upload_multi_files/MultiPartUpload.php") 
Call<ResponseBody> uploadMultiFile(@Body RequestBody file); 
+0

Praca Dobra praca !!! – R2R