问题描述
我尝试了几种方法来为服务器发送图像,就像在Postman中工作一样
但实际上没有解决。
通过@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" />
权限之外。