如何使用Retrofit2传递包含PDF文件的form-data格式请求体
Retrofit2 同时上传PDF文件与表单字段实现方案
方案1:使用@Multipart注解拆分参数(更直观)
首先调整接口定义,添加@Multipart注解,将文件和普通表单字段拆分为独立的@Part参数:
@Multipart @POST("filebase/upload") suspend fun uploadPdfDocument( @Header(HEADER_AUTHORIZATION) authorization: String, // PDF文件参数 @Part pdfFile: MultipartBody.Part, // 普通表单字段,引号内为后端约定的字段名 @Part("user_id") userId: RequestBody, @Part("file_desc") fileDesc: RequestBody ): UploadPdfDocumetResponse?
构造请求参数后调用接口即可:
// 1. 构造普通表单字段RequestBody val userId = RequestBody.create("text/plain".toMediaTypeOrNull(), "10001") val fileDesc = RequestBody.create("text/plain".toMediaTypeOrNull(), "2024年第二季度销售报告") // 2. 构造PDF文件的MultipartBody.Part val pdfFile = File(localPdfPath) // 本地PDF文件实例 val pdfRequestBody = RequestBody.create("application/pdf".toMediaTypeOrNull(), pdfFile) // 第一个参数为后端接收文件的字段名,第二个为上传后展示的文件名 val pdfPart = MultipartBody.Part.createFormData("pdf_document", pdfFile.name, pdfRequestBody) // 3. 调用接口 val response = apiService.uploadPdfDocument("你的鉴权token", pdfPart, userId, fileDesc)
方案2:保留原有@Body传参接口
如果不想修改现有接口定义,可以手动构造完整的MultipartBody作为请求体传入:
val pdfFile = File(localPdfPath) val requestBody = MultipartBody.Builder() .setType(MultipartBody.FORM) // 添加普通表单字段 .addFormDataPart("user_id", "10001") .addFormDataPart("file_desc", "2024年第二季度销售报告") // 添加PDF文件 .addFormDataPart( "pdf_document", pdfFile.name, RequestBody.create("application/pdf".toMediaTypeOrNull(), pdfFile) ) .build() // 直接调用你原有定义的接口 val response = apiService.uploadPdfDocument("你的鉴权token", requestBody)
注意事项
- 所有字段名(包括文件字段、普通表单字段)必须和后端约定的取值完全一致,否则会出现接收不到参数的问题
- PDF文件的MediaType需指定为
application/pdf,避免后端解析异常 - 读取本地文件前需确认已申请对应存储权限,Android 10及以上分区存储场景如果无法直接获取File实例,可以通过Uri读取InputStream来构造RequestBody
内容的提问来源于stack exchange,提问作者Parag Rane
相关产品推荐
相关产品推荐

