Ham*_*ian 13 android retrofit2
我想在Android中将二进制文件上传到服务器.我通过邮递员测试Api方法:
没关系,你可以看到还有另一个选项可以上传文件作为表单数据(键,值):
每个教程(如本教程)都描述了如何上传文件multipart/form-data:
// create RequestBody instance from file
RequestBody requestFile =
RequestBody.create(MediaType.parse("multipart/form-data"), file);
// MultipartBody.Part is used to send also the actual file name
MultipartBody.Part body =
MultipartBody.Part.createFormData("picture", file.getName(), requestFile);
Run Code Online (Sandbox Code Playgroud)
我搜索了很多,但找不到任何方法上传文件作为二进制与retrofit2.
改造存储库中只有一个问题,询问我如何在改装2.0测试版中发布图像二进制文件?.我用它的解决方案:
API服务:
@POST("trip/{tripId}/media/photos")
Call<MediaPost> postEventPhoto(
@Path("eventId") int tripId,
@Header("Authorization") String accessToken,
@Query("direction") String direction,
@Body RequestBody photo);
Run Code Online (Sandbox Code Playgroud)
呼叫者:
InputStream in = new FileInputStream(new File(media.getPath()));
byte[] buf;
buf = new byte[in.available()];
while (in.read(buf) != -1);
RequestBody requestBody = RequestBody
.create(MediaType.parse("application/octet-stream"), buf);
Call<MediaPost> mediaPostCall = tripApiService.postTripPhoto(
tripId,
((GlobalInfo) getApplicationContext()).getApiAccessToken(),
direction,
requestBody);
Run Code Online (Sandbox Code Playgroud)
但我得到了这个错误:
java.lang.IllegalArgumentException: @Body parameters cannot be used with form or multi-part encoding.
Run Code Online (Sandbox Code Playgroud)
我的代码出了什么问题?我该怎么办?
Dar*_*ind 10
只是添加另一个解决方案,因为我必须先深入了解一下问题中发生了什么。
我的解决方案是byte[]直接将二进制文件作为 a 获取,然后将其放入RequestBody. 所以最后,代码看起来像这样:
interface RetrofitService {
@POST("api/v1/upload_file")
Call<Void> uploadBinaryFile(@Body RequestBody body);
}
Run Code Online (Sandbox Code Playgroud)
并称之为:
public void uploadBinaryFile(File fileToUpload) {
retrofitService
.uploadBinaryFile(RequestBody.create(MediaType.parse("application/octet"),
Files.readAllBytes(fileToUpload));
}
Run Code Online (Sandbox Code Playgroud)
这与 OP 的原始问题基本相同,但为了清楚起见,我也将这个答案留给下一位读者。
经过数小时的搜索,我发现@Multipart上一个示例的API接口中仍然有一个注释!这样可以防止将二进制数据发送到服务器,并且改造存储库中的解决方案就可以了!
在 Kotlin 中你可以这样做:
val file: File = retrieveMyJavaFile()
val requestBody: RequestBody = file.asRequestBody("application/octet-stream".toMediaTypeOrNull())
val response: MyResponse = myAPI.uploadPhoto(requestBody).body()!!
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7044 次 |
| 最近记录: |