如何使用Retrofit上传照片?

Ara*_*ini 3 android multipartform-data retrofit

我在Android应用程序中使用Retrofit与REST-API进行通信.当用户在我的应用程序中更改其个人资料图片时,我需要发送请求并上传新图像.这是我的服务:

 @Multipart
 @PATCH("/api/users/{username}/")
 Call<User> changeUserPhoto(@Header("Authorization") String token,@Path("username") String userName , @Part("photo") RequestBody photo);
Run Code Online (Sandbox Code Playgroud)

这是我发送请求的代码:

Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(GlobalVars.BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .build();
        UserService userService = retrofit.create(UserService.class);
        Callback<User> callback = new Callback<User>() {
            @Override
            public void onResponse(Response<User> response, Retrofit retrofit) {

                if (response.isSuccess()) {
                    //do sth
                } else {
                   // do sth else
                }
            }


            @Override
            public void onFailure(Throwable t) {
                t.printStackTrace();
            }
        };
        RequestBody photo = RequestBody.create(MediaType.parse("application/image"), new File(imageUir));
        Call<User> call = userService.changeUserPhoto(token, username, photo);

        call.enqueue(callback);
Run Code Online (Sandbox Code Playgroud)

但是当我将此请求发送到服务器时,REST一直告诉我照片不是文件,编码类型有问题.任何人都可以帮我解决这个问题吗?

小智 6

尝试使用@Body而不是@Part.

@PATCH("/api/users/{username}/")
Call<User> changeUserPhoto(@Header("Authorization") String token,@Path("username") String userName , @Body RequestBody photo);
Run Code Online (Sandbox Code Playgroud)

然后MultipartBuilder用来构建RequestBody

RequestBody photo = RequestBody.create(MediaType.parse("application/image"), file);
RequestBody body = new MultipartBuilder()
        .type(MultipartBuilder.FORM)
        .addFormDataPart("photo", file.getName(), photo)
        .build();

Call<User> call = userService.changeUserPhoto(token, username, body);
...
Run Code Online (Sandbox Code Playgroud)

编辑:

您也可以查看我对非常相似问题的答案.