在Android中通过JSOnobject传递多个图像

时间:2019-03-07 06:54:11

标签: android json retrofit2


我需要上传具有2个参数的JSONObject =第一个是已经生成的约会密钥(一种类型的ID来获取数据),第二个是多图像部分(难处理的部分是图像编号不固定)它是动态分配的。它可以是2或5或10,具体取决于通过它的用户,我已经将所有图像路径都放在一个array-list中。)

"appointment_key":appointment_key, "agreements" :{"agreement_no":{"1":{"file_name":"bond1"}, "2":{"file_name":"bond2"}}} 
  • bond1和bond2是图像Uri并由用户指定。
  • “ appointment_key”和“ agreements”是静态的@fields。也是“文件名”是静态的。
    *我已经为图像路径创建了数组列表。现在我只需要使用正确的方法通过它。

现在,我只需要将该数组列表传递给API接口。好像我不知道该怎么做...

1 个答案:

答案 0 :(得分:0)

如果您使用的是List<MultipartBody.Part>,则可以在改造请求中将@Part传递为@Multipart。这是我在做什么:

所以首先我们需要一个函数将文件转换为MultipartBody.Part

public static MultipartBody.Part toMultiPartFile(String appointmentKey, File file) {
        RequestBody reqFile = RequestBody.create(MediaType.parse(String.format("image/%s",
                file.getAbsolutePath().substring(file.getAbsolutePath().lastIndexOf(".") + 1))), file);

        return MultipartBody.Part.createFormData(appointmentKey,
                file.getName(),
                reqFile);
}

然后我确实拥有另一个函数,该函数接受Map<String, File>作为参数将其转换为List<MultipartBody.Part>

public static List<MultipartBody.Part> toMultipartAttachments(Map<String, File> files) {
        List<MultipartBody.Part> parts = new ArrayList<>();

        if (files != null) {
            for (Map.Entry<String, File> stringFileEntry : files.entrySet()) {
                if (stringFileEntry.getValue() != null && stringFileEntry.getKey() != null) {
                    parts.add(toMultiPartFile(stringFileEntry.getKey(), stringFileEntry.getValue()));
                }
            }
        }

        return parts;
}

然后,您可以在调用改造请求后调用toMultipartAttachments函数:

@Multipart
@POST("your api endpoint here")
function apiCall(@Part List<MultipartBody.Part> attachments)

apiCall(toMultipartAttachments(imagesMap))

您只需要将约会密钥和图像放在Map上即可。