【问题标题】:upload array of images in multipart retrofit2在多部分改造2中上传图像数组
【发布时间】:2017-11-02 01:32:15
【问题描述】:

我需要使用多部分在服务器上上传一组图像。我还想为该数组提供密钥,否则服务器无法识别该数组。我尝试了以下解决方案,但这些都不起作用: 解决方案1

 MultipartBody.Part[] array = new MultipartBody.Part[items.size()];
            for(int i=0;i<items.size();i++){
                File file = new File(items.get(i));
                RequestBody requestBody = RequestBody.create(MediaType.parse("image/*"), file);
                MultipartBody.Part filePart = MultipartBody.Part.createFormData("value_"
                                + String.valueOf(uploadMissionRequestModel.getStepId()), file.getName(),
                        requestBody);
                array[i]=filePart;
            }

RequestBody apiKey = RequestBody.create(MediaType.parse("text/plain"),
                uploadMissionRequestModel.getApiKey());
        RequestBody stepId = RequestBody.create(MediaType.parse("text/plain"),
                String.valueOf(uploadMissionRequestModel.getStepId()));
        RequestBody missionId = RequestBody.create(MediaType.parse("text/plain"),
                String.valueOf(uploadMissionRequestModel.getMissionId()));
        RequestBody overWrite = RequestBody.create(MediaType.parse("text/plain"),
                "yes");

        Map<String, RequestBody> partMap = new HashMap<>();
        partMap.put("api_token", apiKey);
        partMap.put("MissionID", missionId);
        partMap.put("overwrite", overWrite);
        partMap.put("StepID", stepId);

 ApiServices service = RestClient.getClient();
        final Call<UploadMissionResponse> call = service.uploadFiles(partMap, array);

解决方案2

RequestBody[] image_id = new RequestBody[items.size()];
        for(int i=0;i<items.size();i++){
            File file = new File(items.get(i));
            RequestBody requestBody = RequestBody.create(MediaType.parse("image/*"), file);
            image_id[i]=requestBody;

        }
RequestBody apiKey = RequestBody.create(MediaType.parse("text/plain"),
                uploadMissionRequestModel.getApiKey());
        RequestBody stepId = RequestBody.create(MediaType.parse("text/plain"),
                String.valueOf(uploadMissionRequestModel.getStepId()));
        RequestBody missionId = RequestBody.create(MediaType.parse("text/plain"),
                String.valueOf(uploadMissionRequestModel.getMissionId()));
        RequestBody overWrite = RequestBody.create(MediaType.parse("text/plain"),
                "yes");

        Map<String, RequestBody> partMap = new HashMap<>();
        partMap.put("api_token", apiKey);
        partMap.put("MissionID", missionId);
        partMap.put("overwrite", overWrite);
        partMap.put("StepID", stepId);

        Map<String, RequestBody[]> imageMap = new HashMap<>();
        imageMap.put("value_8",image_id);

ApiServices service = RestClient.getClient();
        final Call<UploadMissionResponse> call = service.uploadFiles(partMap, imageMap);

请建议,我如何使用 retrofit2 传递带有键名的图像数组。

【问题讨论】:

    标签: android image upload retrofit2


    【解决方案1】:

    我的请求方式:

    @Multipart
    @POST("admin/assets/upload/")
    Observable<UploadResponse> uploadFiles(@Part MultipartBody.Part... files);
    

    从 uri 数组创建部件。所有部分都有关键的“文件[]”,这是我的后端识别的:

    //UriHandle and OkioUtil are my own classes to handle both 'content' and 'file' uris
    //files has type of Uri[]
    final MultipartBody.Part[] parts = new MultipartBody.Part[files.length];
    for (int i = 0; i < files.length; i++) { 
        final UriHandle handle = UriUtil.getUriHandle(context, files[i]);
        final RequestBody body = OkioUtil.create(handle, mediaType);
        parts[i] = MultipartBody.Part.createFormData("files[]", handle.name(), body);
    }
    

    发送请求:

    api.uploadFiles(part)
        .subscribeOn(...)
        .observeOn(...)
        .subscribe(result -> ...);
    

    【讨论】:

    • 非常感谢。你拯救了我的一天。
    【解决方案2】:

    如果我是你,我会将图像转换为 Base64 并使用你的第二种解决方案发送 List&lt;String&gt; 获取图像。

    【讨论】:

    • 能解释一下原因吗?
    猜你喜欢
    • 2018-04-15
    • 2017-01-14
    • 2016-10-13
    • 2021-11-17
    • 2016-04-10
    • 2015-09-16
    • 1970-01-01
    • 2015-11-29
    • 2016-12-15
    相关资源
    最近更新 更多