Retrofit2无法使用Multipart或RequestBody

问题描述

我尝试了几种方法来为服务器发送图像,就像在Postman中工作一样

enter image description here

但实际上没有解决。

通过@Multipart的第一种方法:

interface Api {   
@Multipart
@POST("/upload-file")
fun uploadFile(@Part("file") file: RequestBody,@Part("data") id: FileUploadModel): Single<Response<AdvertisementResponse>>
}

存储库类中的方法:

 override fun uploadFile(
    id: FileUploadModel,filePath: String
): Single<Response<AdvertisementResponse>> {

    val requestFile = RequestBody.create(MediaType.parse("image/*"),file)

    return api.uploadFile(requestFile,id)
}

使用RequestBody的第二种方式:

 @POST("/upload-file")
 fun uploadFile(@Body requestBody: RequestBody): Single<Response<AdvertisementResponse>>

存储库类中的方法:

override fun uploadFile(
    id: FileUploadModel,filePath: String
): Single<Response<AdvertisementResponse>> {

    val file = File(filePath)
    val builder = MultipartBody.Builder()
    builder.setType(MultipartBody.FORM)

    val requestFile = RequestBody.create(MediaType.parse("image/*"),file)

    builder.addFormDataPart("file",file.name,requestFile)
    builder.addFormDataPart("data",id.toJson())

    return api.uploadFile(builder.build())
}

通过MultipartBody.Part的第三种方式:

@Multipart
@POST("/upload-file")
fun uploadFile(@Part("file") file: MultipartBody.Part,@Part("data") id: FileUploadModel): Single<Response<AdvertisementResponse>>

存储库类中的方法:

 override fun uploadFile(
    id: FileUploadModel,filePath: String
): Single<Response<AdvertisementResponse>> {

    val file = File(filePath)
    val requestFile = RequestBody.create(MediaType.parse("image/*"),file)
    val multipartFile = MultipartBody.Part.createFormData("file",requestFile)

    return api.uploadFile(multipartFile,id)
}

日志显示对上传文件的POST请求未完成:

2020-08-15 13:52:35.828 D / OkHttpInterceptor:-> POST http:// #### / advertisement 2020-08-15 13:52:35.829 D / OkHttpInterceptor:内容类型:application / json 2020-08-15 13:52:35.829 D / OkHttpInterceptor:内容长度:233 2020-08-15 13:52:35.829 D / OkHttpInterceptor:{“ businessName”:“ mgskhsgmhz”,“ email”:“ test@email.com”,“ emirates”:“ Abu Dhabi”,“ image”:“ / storage / emulated / 0 / Pictures / 1768cbfe-e5eb-4ae0-b642-be2733cfedbe969168674235591591.jpg“,” note“:”“,” ownerName“:” mhzm“,” phone“:” 1111“,” website“:”“ } 2020-08-15 13:52:35.829 D / OkHttpInterceptor:-> END POST(233字节的正文) 2020-08-15 13:52:36.233 D / OkHttpInterceptor: POST http:// #### / upload-file 2020-08-15 13:52:36.278 D / OkHttpInterceptor:内容类型:multipart / form-data;边界= 894cbe1b-0fc4-47c6-849d-3764193c214f 2020-08-15 13:52:36.279 D / OkHttpInterceptor:内容长度:104305

我想知道为什么Retrofit无法完成此类请求。

感谢任何建议

欢呼

解决方法

该问题是由于无法从磁盘读取文件引起的。

android:requestLegacyExternalStorage="true"添加到Android Manifest可以使用Android sdk 29。

<application
android:name=".MyApplication"
android:requestLegacyExternalStorage="true" ...

除了添加<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />权限之外。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...