android - 在 multipart retrofit2 中上传图像数组

标签 android image upload retrofit2

我需要使用多部分在服务器上上传一组图像。我还想为该数组提供 key ,否则服务器无法识别该数组。我已经尝试了以下解决方案,但这些都不起作用: 解决方案 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 传递带有键名的图像数组。

最佳答案

我的请求方式:

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

从 uri 数组创建部件。所有部分都将具有 key “files[]”,这是我的后端识别的:

//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 -> ...);

关于android - 在 multipart retrofit2 中上传图像数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44298417/

相关文章:

php - 如何使用 PHP 将透明 PNG 与图像合并?

php - 使用ajax上传文件并传递变量

PHP Codeigniter 上传类,使用特定模式重命名文件

Android TCP 发送文件。 Android 客户端将图像发送到 Java 服务器。无法发送图像。该怎么办?

Android 照片上传截断图像?

此处不允许使用 Android list 属性

ios - 如何在 Xcode 中对图像 Assets 使用本地化?

amazon-web-services - 使用 AWS S3 签名 url 获取上传进度

java - 从按钮和菜单项 JAVA 访问相同的 fragment

android - FrameLayout 与我嵌入在 CoordinatorLayout 中的 BottomAppBar 重叠