在Android中使用改进2上传二进制文件

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 的原始问题基本相同,但为了清楚起见,我也将这个答案留给下一位读者。


Ham*_*ian 5

经过数小时的搜索,我发现@Multipart上一个示例的API接口中仍然有一个注释!这样可以防止将二进制数据发送到服务器,并且改造存储库中的解决方案就可以了!

  • 您忘记添加它还是删除了它? (2认同)
  • @Hamed你可以发布你的方法定义吗 (2认同)
  • 你的回答对于新手来说是无法理解的。 (2认同)

Tia*_*ago 5

在 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)