2017-10-26 1 views
0

Ich erstelle eine Anwendung für Android und ich habe gerade angefangen, Retrofit 2 zu verwenden. Ich muss ID, Name, Code und Fotos auf Server hochladen, aber ich weiß nicht, wie das mit Retrofit 2 zu tun ist. Wie Sie sehen werden Klasse unten ich weiß nicht, wie viele Fotos ich werde laden müssen ...Wie können Sie mehrteilige Formulardaten, die eine unbekannte Anzahl von Bildern enthalten, mit Retrofit 2 posten?

ich diese Klasse haben:

class Asset { 
    private int mId; 
    private int mName; 
    private int mCode; 
    private ArrayList<String> mPhotos; 

    // ... constructor 
    // ... getters and setters 
} 

I und das ist Repository:

class AssetsRepository { 
    // ... private fields 
    // ... constructor 

    public void store(Asset asset, final AssetUploadCompletedCallback callback) { 
     // What should be the arguments? 
     this.mNPApiService.storeAsset(asset.getCode() /*, ...*/) 
       .enqueue(new Callback<String>() { 
        @Override 
        public void onResponse(Call<String> call, Response<String> response) { 
         callback.onAssetUploadCompletedCallback(); 
        } 

        @Override 
        public void onFailure(Call<String> call, Throwable t) { 
         //error handling 
        } 
       }); 
    } 

} 

und NPApiservice Schnittstelle:

Ich brauche auch einen Fortschrittsbalken mit Prozentsatz, also wie kann ich Hörer anhängen, der mir sagen wird, insgesamt Upload Prozentsatz der Anfrage?

Antwort

3

Hoffnung das wird Ihnen helfen mehrere Bilder mit mehrteiligen hochladen:

@Multipart @POST(TMB_API_DIR + "/uploadFile") Call<DataResponse> uploadImageFiles(@Part MultipartBody.Part[] partMap, @Query("access_token") String accessToken);

Hier haben wir Array für Teil von MultipartBody mit einem anderen Parameter wie Access Token verwendet.

+0

Ich habe ähnliche Methode in meiner 'NPApiService' Schnittstelle und im Repository implementiert Erstellung von' MultipartBody.Part [] 'Array, aber ich weiß immer noch nicht, wie kann ich Upload-Fortschritt in Prozent zu verfolgen. Ich habe dieses Beispiel gefunden: https://www.cumulations.com/blogs/34/Retrofit-File-Update-Progress, aber ich habe viele Dateien und auch andere Parameter wie 'name',' id' und 'code' im Körper der Anfrage, und ich brauche insgesamt Upload Prozentsatz der Anfrage. Unterteile ich RequestBody und MultipartBody.Part, berechne die Gesamtlänge des Körpers meiner Anfrage selbst und füge den Listener wie im Beispiel vorgeschlagen hinzu. – clzola

+0

ja - Sie können weitermachen, wenn Sie die Gesamtlänge des Anfragekörpers einschließlich aller Bilder berechnen können. Ich habe das gleiche gemacht, aber ohne Fortschritte entsprechend meinen Anforderungen. –

+0

Ich habe genau das gemacht, ich habe 'RequestBody' Klasse erweitert und meine Puffergröße 4096 Bytes lang gemacht (Code ist dem Link sehr ähnlich, den ich im vorherigen Kommentar gepostet habe) und ich hoffe die Puffergröße ist in Ordnung. Und alles funktioniert! – clzola

0

hier ist, wie ich es mache und funktioniert perfekt, dies lädt den gesamten Ordner, Sie können sich entsprechend ändern, ur Dateien zu behandeln.

Sie müssen hier Mehrteiliger Format

verwenden, ist ein Codebeispiel Im Folgenden

@Multipart 
    @POST("sync/contact/image") 
    Call<Response> ImageUpload(@Part MultipartBody.Part file); 

    @Multipart 
    @POST("sync/image") 
    Call<ResponseBody> MultiImageUpload(@PartMap() Map<String, RequestBody> mapFileAndName); 


public static HashMap<String, RequestBody> GetAllImage(Context context) { 
     File files = new File(Environment.getExternalStorageDirectory().getAbsolutePath(), "/.ELMEX"); 
     File[] filesArray = files.listFiles(); 
     List<File> listOfNames = Arrays.asList(filesArray); 
     HashMap<String, RequestBody> map = new HashMap<>(listOfNames.size()); 
     RequestBody file = null; 

     for (int i = 0, size = listOfNames.size(); i < size; i++) { 
      file = RequestBody.create(MediaType.parse("multipart/form-data"), listOfNames.get(i)); 
      map.put("file\"; filename=\"" + listOfNames.get(i).getName() + ".jpg", file); 
      file = null; 
     } 

     return map; 
    } 


HashMap<String, RequestBody> map = UtilImage.GetAllImage(context); 

     Call<ResponseBody> call = Retro.getRetroWS().MultiImageUpload(map); 
     call.enqueue(new Callback<ResponseBody>() { 
      @Override 
      public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) { 
       Log.d(TAG, "onResponse: "); 
      } 

      @Override 
      public void onFailure(Call<ResponseBody> call, Throwable t) { 
       Log.d(TAG, "onFailure: "); 
      } 
     }); 
Verwandte Themen