【问题标题】:Unable to upload Image with Retrofit 2无法使用 Retrofit 2 上传图像
【发布时间】:2018-07-04 07:59:20
【问题描述】:

我无法从 Retrofit 2 上传图片,请查看我的以下代码

@Multipart
@POST("upload-image")
Call<UploadImageResponse> uploadFile(@Part MultipartBody.Part file, @Part("file") RequestBody name);

我调用的函数就是这样执行的,

// Uploading Image
public void uploadFile()
{
    // Map is used to multipart the file using okhttp3.RequestBody
    File file = new File(sellerActivity.mediaPath);

    // Parsing any Media type file
    RequestBody requestBody = RequestBody.create(MediaType.parse("image/*"), file);

    MultipartBody.Part fileToUpload = MultipartBody.Part.createFormData("file", file.getName(), requestBody);

    RequestBody filename = RequestBody.create(MediaType.parse("text/plain"), file.getName());

    Call<UploadImageResponse> call = apiService.uploadFile(fileToUpload, filename);

    call.enqueue(new Callback<UploadImageResponse>() {
        @Override
        public void onResponse(Call<UploadImageResponse> call, Response<UploadImageResponse> response) {
            if (response.isSuccessful())
            {
                System.out.println("Image Url: " + response.body().getImage() + " " + response.body().getDishesName());
                System.out.println("Image Message: " + response.raw());
            }
            else
            {
                System.out.println("Image Message: " + response.raw());
            }
        }

        @Override
        public void onFailure(Call<UploadImageResponse> call, Throwable t) {
            System.out.println("onFailure: " + t);
        }
    });
}

当我使用邮递员时,我会这样做

我已经搜索并尝试了各种方法,但没有成功。任何帮助将不胜感激。

【问题讨论】:

  • 我没有看到你在 Android 中使用 image 作为文件部分的键。
  • 请看更新!
  • 检查response.body().包含什么。
  • response.body() 返回包名.UploadImageResponse@1f18fc0
  • 那是错误的。检查它的字段。你展示的只是Object的默认toString(0实现@

标签: android laravel retrofit2 image-uploading


【解决方案1】:

您必须对多部分表单数据有一个清晰的了解,因此请阅读this link 和许多其他可用的内容。

答案是更改您的端点方法,如下所示:

@Multipart
@POST("upload-image")
Call<UploadImageResponse> uploadFile(@Part MultipartBody.Part file, @Part("dishes_name") RequestBody name);

您没有为每个部分分配正确的键。

另外,更改实现如下:

// Uploading Image
public void uploadFile()
{
    // Map is used to multipart the file using okhttp3.RequestBody
    File file = new File(sellerActivity.mediaPath);

    // Parsing any Media type file
    RequestBody requestBody = RequestBody.create(MediaType.parse("multipart/form-data"), file);

    MultipartBody.Part fileToUpload = MultipartBody.Part.createFormData("image", file.getName(), requestBody);

    RequestBody filename = RequestBody.create(MediaType.parse("text/plain"), file.getName());

    Call<UploadImageResponse> call = apiService.uploadFile(fileToUpload, filename);

    call.enqueue(new Callback<UploadImageResponse>() {
        @Override
        public void onResponse(Call<UploadImageResponse> call, Response<UploadImageResponse> response) {
            if (response.isSuccessful())
            {
                System.out.println("Image Url: " + response.body().getImage() + " " + response.body().getDishesName());
                System.out.println("Image Message: " + response.raw());
            }
            else
            {
                System.out.println("Image Message: " + response.raw());
            }
        }

        @Override
        public void onFailure(Call<UploadImageResponse> call, Throwable t) {
            System.out.println("onFailure: " + t);
        }
    });
}

MultipartBody.Part.createFormData(keyName, fileName, requestBody)方法中的第一个参数是multipart文件的key名,第二个参数是文件名,第三个参数是这个part的请求体。 link.

希望对你有帮助。

【讨论】:

  • 非常感谢,它只有一件事不起作用是@Part("image") 所以我删除了像@Part MultipartBody.Part 文件这样的“image”,现在它工作正常。再次感谢
  • 我试图投票,但它说感谢您的反馈!声望低于 15 人的投票将被记录,但不会更改公开显示的帖子得分。
  • 负载过大
  • 无济于事 在我的情况下,邮递员返回一个愿望响应,但改造返回 500。
猜你喜欢
  • 2018-04-11
  • 1970-01-01
  • 2021-08-28
  • 1970-01-01
  • 2022-11-11
  • 2017-02-18
  • 2016-09-04
  • 2016-02-16
相关资源
最近更新 更多