正如问题所述,我需要在http POST请求中发送文件列表(在我的例子中是图像),但是在它旁边还有其他字段(常规字符串)。这篇文章看起来像这样(作为表单数据):
type: customerQuery
user: userId
message: The customer query etc.
contact_number: 01234564789
contact_email: email@address.com
files[]: list of files, as binary
当我只发送文件时,文件上传工作正常,如下所示:
@Multipart
@POST("/exampleendpoint/{id}")
suspend fun uploadDocument(
@Path("id") id: String,
@Part document: MultipartBody.Part
): Response<Unit>
如何构造修改后的接口/服务,使其具有文件列表以及其他字段?
谢谢
发布于 2020-03-03 14:59:05
好的,我想我应该为使用Kotlin的任何人添加我自己的答案,如果需要命名文件/图像列表,这也是正确的答案,就像表单数据的其余部分一样。如果您不需要这个,那么接受的答案是有效的,但在我的例子中,它不起作用,因为它们必须在files[]
下运行。
改造服务(只是一个简单的@Body body: RequestBody
字段,并删除@Multipart)
@POST("exampleendpoint/{id}")
fun uploadDocuments(@Path("id") id: String, @Body body: RequestBody): Response<Unit>;
然后,您需要构造一个完整的RequestBody,包括所需的所有内容,如下所示:
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)
发布于 2020-03-03 12:06:48
去做吧
@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);
并添加这样的文件列表
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
,如
RequestBody type = RequestBody.create(MediaType.parse("text/plain"), "your data...");
https://stackoverflow.com/questions/60506677
复制相似问题