【问题标题】:How to post multipart form data that includes unknown number of images with Retrofit 2?如何使用 Retrofit 2 发布包含未知数量图像的多部分表单数据?
【发布时间】:2018-03-25 23:54:49
【问题描述】:

我正在为 Android 创建一个应用程序,并且刚刚开始使用 Retrofit 2。我必须将 ID、名称、代码和照片上传到服务器,但我不知道如何使用 Retrofit 2 来做到这一点。正如您将看到的从下面的课我不知道我需要上传多少张照片......

我有这门课:

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

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

我和这是存储库:

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?*/)
}

我还需要带有百分比的进度条,那么如何附加监听器来告诉我请求的总上传百分比?

【问题讨论】:

    标签: android retrofit2 multipartform-data


    【解决方案1】:

    希望这将帮助您上传多部分的多张图片:

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

    这里我们使用了数组作为 MultipartBody 的一部分以及另一个参数,比如访问令牌。

    【讨论】:

    • 我在NPApiService 接口中创建了类似的方法,并在存储库中实现了MultipartBody.Part[] 数组的创建,但是我仍然不知道如何以百分比跟踪上传进度。我找到了这个例子:cumulations.com/blogs/34/Retrofit-File-Update-Progress,但我有很多文件和其他参数,如nameidcode 在请求正文中,我需要请求的总上传百分比。我是否将 RequestBody 和 MultipartBody.Part 子类化,自己计算请求正文的总长度,并按照示例中的建议附加侦听器?
    • 是的 - 如果您可以计算包括所有图像在内的请求正文的总长度,您可以继续。我也做了同样的事情,但按照我的要求没有进展。
    • 我确实做到了,我扩展了RequestBody 类,并使我的缓冲区大小为 4096 字节长(代码与我在之前评论中发布的链接非常相​​似),我希望缓冲区大小没问题.一切正常!
    • 太棒了。快乐编码
    【解决方案2】:

    这是我的做法。这会上传整个文件夹,您可以相应地更改以处理您的文件。您需要使用多部分格式。

    这是一个代码示例:

        @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: ");
                }
            });
    

    【讨论】:

      猜你喜欢
      • 2016-04-06
      • 2017-04-05
      • 2015-06-23
      • 1970-01-01
      • 2018-04-27
      • 2015-10-31
      • 2016-05-13
      • 1970-01-01
      相关资源
      最近更新 更多