首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将文件列表作为Retrofit 2主体的一部分与Android中的其他常规字符串字段一起发送?

如何将文件列表作为Retrofit 2主体的一部分与Android中的其他常规字符串字段一起发送?
EN

Stack Overflow用户
提问于 2020-03-03 11:53:38
回答 2查看 3.2K关注 0票数 0

正如问题所述,我需要在http POST请求中发送文件列表(在我的例子中是图像),但是在它旁边还有其他字段(常规字符串)。这篇文章看起来像这样(作为表单数据):

代码语言:javascript
运行
复制
type: customerQuery
user: userId
message: The customer query etc.
contact_number: 01234564789
contact_email: email@address.com
files[]: list of files, as binary

当我只发送文件时,文件上传工作正常,如下所示:

代码语言:javascript
运行
复制
  @Multipart
  @POST("/exampleendpoint/{id}")
  suspend fun uploadDocument(
      @Path("id") id: String,
      @Part document: MultipartBody.Part
  ): Response<Unit>

如何构造修改后的接口/服务,使其具有文件列表以及其他字段?

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-03-03 14:59:05

好的,我想我应该为使用Kotlin的任何人添加我自己的答案,如果需要命名文件/图像列表,这也是正确的答案,就像表单数据的其余部分一样。如果您不需要这个,那么接受的答案是有效的,但在我的例子中,它不起作用,因为它们必须在files[]下运行。

改造服务(只是一个简单的@Body body: RequestBody字段,并删除@Multipart)

代码语言:javascript
运行
复制
@POST("exampleendpoint/{id}")
fun uploadDocuments(@Path("id") id: String, @Body body: RequestBody): Response<Unit>;

然后,您需要构造一个完整的RequestBody,包括所需的所有内容,如下所示:

代码语言:javascript
运行
复制
val requestBody = MultipartBody.Builder().setType(MultipartBody.FORM).apply {
  addFormDataPart("type", "booking")
  addFormDataPart("user", "username")
  addFormDataPart("message", "message text goes here")
  addFormDataPart("contact_number", "0123456789")
  addFormDataPart("contact_email", "email@address.com")
  // my files are List<ByteArray>, okhttp has a few utility methods like .toRequestBody for various types like below
  files.forEachIndexed { index, bytes ->
     addFormDataPart("files[]", "$index.jpg", bytes.toRequestBody("multipart/form-data".toMediaTypeOrNull(), 0, bytes.size))
  }
}.build()
service.uploadDocuments("uploadId", requestBody)
票数 4
EN

Stack Overflow用户

发布于 2020-03-03 12:06:48

去做吧

代码语言:javascript
运行
复制
@Multipart
@POST("exampleendpoint/{id}")
Call<Unit> uploadDocument(@Path("id") String id,
                          @Part("type") RequestBody type,
                          @Part("user") RequestBody user,
                          @Part("message") RequestBody message,
                          @Part("contact_number") RequestBody contact_number,
                          @Part("contact_email") RequestBody contact_email,
                          @Part List<MultipartBody.Part> file);

并添加这样的文件列表

代码语言:javascript
运行
复制
ArrayList<File> tempFilesList = new ArrayList<>();
ArrayList<MultipartBody.Part> images = new ArrayList<>();
for (int i = 0; i < tempFilesList.size(); i++) {
    images.add(prepareImageFilePart("files" + (i + 1), tempFilesList.get(i).getImage()));
}

@NonNull
private MultipartBody.Part prepareImageFilePart(String partName, File file) {
    RequestBody requestFile =
            RequestBody.create(
                    MediaType.parse("image/jpg"),
                    file
            );
    return MultipartBody.Part.createFormData(partName, file.getName(), requestFile);
}

您可以创建其他字段的RequestBody,如

代码语言:javascript
运行
复制
RequestBody type = RequestBody.create(MediaType.parse("text/plain"), "your data...");
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60506677

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档