2017-10-26 10 views
0

私はAndroid用のアプリケーションを作成しています。私はRetrofit 2を使用し始めました。ID、名前、コード、写真をサーバにアップロードする必要がありますが、改造2で行う方法はわかりません。私は私がアップロードする必要がありますどのように多くの写真を知りません以下のクラス...Retrofit 2で未知数の画像を含むマルチパートフォームデータを投稿するには?

私はこのクラスを持っている:

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

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

I、これはリポジトリです:

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 
        } 
       }); 
    } 

} 

そしてNPApiserviceインタフェース:

interface NPApiService { 
    // ... other methods 

    @Multipart 
    @Post("/assets/{code}") 
    Call<String> storeAsset(@Path("code") String code /*, what should go here?*/) 
} 

また、パーセンテージでプログレスバーを設定する必要があります。リクエストの総アップロード率を教えてくれるリスナーをどうやって追加できますか?

答えて

3

希望以下のコードサンプルです:

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

ここでは、MultipartBodyのPart for Arrayをアクセストークンのような別のパラメータとともに使用しました。

+0

私は 'NPApiService'インターフェースとリポジトリで' MultipartBody.Part [] '配列の作成を実装しましたが、アップロードの進行状況をパーセンテージでどのように追跡できるかはまだ分かりません。私はこの例を見つけました:https://www.cumulations.com/blogs/34/Retrofit-File-Update-Progressしかし、私はbody内に 'name'、' id'と 'code'のような多くのファイルと他のパラメータを持っていますリクエストの合計アップロード率が必要です。私はRequestBodyとMultipartBody.Partをサブクラス化し、自分のリクエストのボディの総レングスを自分で計算し、この例で提案されているようにリスナーをアタッチしますか? – clzola

+0

はい - すべての画像を含むリクエスト本文の合計長を計算できる場合は、先に進むことができます。私は同じことをしましたが、私の要求に従って進歩はありませんでした。 –

+0

私はそれを正確に行いました。私は 'RequestBody'クラスを拡張し、バッファサイズを4096バイトにしました(コードは以前のコメントに投稿したリンクと非常に似ています)。そしてすべてが機能します! – clzola

0

ここで私はそれを行い、完璧に動作します。これはフォルダ全体をアップロードします.Uはファイルを扱うように変更することがあります。これは、マルチパートで複数の画像をアップロードするのに役立ちますあなたがここにマルチパート形式に

を使用する必要が

@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: "); 
      } 
     }); 
関連する問題