2015-12-21 16 views
11

Witam AndroidUploaders,Android okHttp addFormDataPart dynamicznie Multiple obrazu

I dał odpowiedź Uploading a large file in multipart using OkHttp ale siedzę z wielokrotnego przesyłania obrazu.

Chcę wgrać dynamicznie obraz 1 do 10 na raz.

RequestBody requestBody = new MultipartBuilder() 
        .type(MultipartBuilder.FORM) 
        .addFormDataPart(KEY_PHOTO_CAPTION, photoCaption) 
        .addFormDataPart(KEY_FILE, "profile.png", RequestBody.create(MEDIA_TYPE_PNG, sourceFile)) 
        .build(); 

mam ArrayList z PhotoCaption klasy, która ma captionPhoto i urlPhoto więc jak mogę addFormDataPart()

myślę zrobić pętlę i wywołać tę funkcję, że wiele razy z rozmiaru ArrayList.

Czy istnieje jakieś rozwiązanie do stosowania addFormDataPart() używać dynamicznie?

Odpowiedz

15

Ta odpowiedź jest dla OkHttp2

Dla OkHttp3 Widać this post.

Dla wielu obrazów wystarczy uruchomić pętlę zgodnie z wymaganiami, pozostała część związana z żądaniem będzie taka sama jak Ty.

// final MediaType MEDIA_TYPE_PNG = MediaType.parse("image/png"); 
final MediaType MEDIA_TYPE=MediaType.parse(AppConstant.arrImages.get(i).getMediaType()); 

//If you can have multiple file types, set it in ArrayList 
        MultipartBuilder buildernew = new MultipartBuilder().type(MultipartBuilder.FORM) 
          .addFormDataPart("title", title) 

        for (int i = 0; i < AppConstants.arrImages.size(); i++) { 
         File f = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), 
           TEMP_FILE_NAME + i + ".png"); 
         if (f.exists()) { 
          buildernew.addFormDataPart(TEMP_FILE_NAME + i, TEMP_FILE_NAME + i + FILE_EXTENSION, RequestBody.create(MEDIA_TYPE, f)); 
         } 
        } 
        RequestBody requestBody = buildernew.build(); 
        Request request = new Request.Builder() 
          .url(Url.URL + Url.INSERT_NEWS) 
          .post(requestBody) 
          .build(); 

        OkHttpClient client = new OkHttpClient(); 
        Response response = client.newCall(request).execute(); 
        return response.body().string(); 

nie zapomnij usuwać temp. pliki, które przesłałeś pod numer , jeśli nie są przydatne.

+0

Wybieram dynamicznie jak ** 2 png **, ** 3 gif ** i ** 5 jpeg **, a następnie? –

+2

** Aktualizacja maj 2016 **: MultipartBuilder jest teraz zastąpiony przez MultipartBody.Builder ;-) – PAD

17

Tutaj utworzyłem funkcję przesyłania wielu obrazów.

/** 
* Here I am uploading MultipleImages from List of photoCaption 
* Sending photoCaption with URL and Caption of Photo... 
* 
* @param albumId 
* @param photoCaptions 
* @return 
*/ 
public static JSONObject uploadAlbumImage(String albumId, ArrayList<PhotoCaption> photoCaptions) { 

    try { 

     MultipartBuilder multipartBuilder = new MultipartBuilder().type(MultipartBuilder.FORM); 

     int length = photoCaptions.size(); 
     int noOfImageToSend = 0; 
     for(int i = 0; i < length; i++) { 
      /** 
      * Getting Photo Caption and URL 
      */ 
      PhotoCaption photoCaptionObj = photoCaptions.get(i); 
      String photoUrl = photoCaptionObj.getPhotoUrl(); 
      String photoCaption = photoCaptionObj.getPhotoCaption(); 

      File sourceFile = new File(photoUrl); 

      if(sourceFile.exists()) { 
       /** Changing Media Type whether JPEG or PNG **/ 
       final MediaType MEDIA_TYPE = MediaType.parse(FileUtils.getExtension(photoUrl).endsWith("png") ? "image/png" : "image/jpeg"); 

       /** Adding in MultipartBuilder **/ 
       multipartBuilder.addFormDataPart(KEY_IMAGE_CAPTION + i, photoCaption); 
       multipartBuilder.addFormDataPart(KEY_IMAGE_NAME + i, sourceFile.getName(), RequestBody.create(MEDIA_TYPE, sourceFile)); 

       /** Counting No Of Images **/ 
       noOfImageToSend++; 
      } 
     } 

     RequestBody requestBody = multipartBuilder 
       .addFormDataPart(KEY_ALBUM_ID, albumId) 
       .addFormDataPart(KEY_IMAGE_COUNT, String.valueOf(noOfImageToSend)) 
       .build(); 

     Request request = new Request.Builder() 
       .url(URL_ALBUM_UPLOAD_IMAGE) 
       .post(requestBody) 
       .build(); 

     OkHttpClient client = new OkHttpClient(); 
     Response response = client.newCall(request).execute(); 

     /** Your Response **/ 
     String responseStr = response.body().string(); 

     Log.i(TAG, "responseStr : "+ responseStr); 

     return new JSONObject(responseStr); 

    } catch (UnknownHostException | UnsupportedEncodingException e) { 
     Log.e(TAG, "Error: " + e.getLocalizedMessage()); 
    } catch (Exception e) { 
     Log.e(TAG, "Other Error: " + e.getLocalizedMessage()); 
    } 
    return null; 
} 

Mam nadzieję, że ci to pomoże.

+0

Sprawdź Edytowaną odpowiedź na [** okhttp3 **] (http://stackoverflow.com/a/34127008/1318946) –

+1

Dzięki, Oszczędzasz mój czas. Dzięki jeszcze raz..........:) – Shailesh

Powiązane problemy