【问题标题】:Android - Retrofit - File Uploaded to AWS S3 with pre-signed url is corruptAndroid - 改造 - 使用预签名 URL 上传到 AWS S3 的文件已损坏
【发布时间】:2017-10-30 11:10:22
【问题描述】:

在我的应用程序中,我需要将图像直接上传到 AWS S3。为此,我的服务器生成一个预签名的 url,移动客户端使用该 url 来放置文件。虽然在上传调用中获得 200,但文件未正确上传,即它已损坏并且永远不会加载回来。 以下是用于将文件上传到 S3 的代码。

public static interface FileUploadService {
    @PUT("/")
    void upload(@Body() RequestBody body,
                Callback<Object> callback);
}


ServiceGenerator.getUploadService(url).upload(
                    RequestBody.create(MediaType.parse("image/jpeg"), image),
                    new Callback<Object>() { });

我正在使用 Retrofit 1.8。

【问题讨论】:

  • 为什么不从 AWS s3 服务上传文件,而不是使用改造
  • 是否发生在 REST 客户端?
  • @AbdulKawee 我没听懂你想说的话。
  • @PratikVyas 我正在移动设备上测试它。不过,它在我的 web 应用上运行良好。
  • 好的,我可以假设 AWS S3 使用与您的移动平台相同的 API 完美地接受来自 webapps 的请求吗?

标签: android amazon-web-services amazon-s3 retrofit


【解决方案1】:

你好,如果有帮助,试试这个,但我用的是 Retrofit 2,

Gradle

 compile 'com.squareup.retrofit2:retrofit:2.0.2'

界面

public static interface FileUploadService {
   @Multipart
    @POST(HttpConstants.FILEUPLOADJSON1)
    Call<Result> uploadImage(@Part MultipartBody.Part file, @Part("stdID") int stdID);
}

召唤

RaytaApi 服务= RaytaServiceClass.getApiService();

    File file = new File(imagePath);

    RequestBody requestFile = RequestBody.create(MediaType.parse("multipart/form-data"), file);


    MultipartBody.Part body =
            MultipartBody.Part.createFormData("uploaded_file", file.getName(), requestFile);

    Call<Result> resultCall=service.uploadImage(body,INT_STDID);
    final Result[] result = {new Result()};

    resultCall.enqueue(new Callback<Result>() {
        @Override
        public void onResponse(Call<Result> call, Response<Result> response) {
            Log.v("@@@WWE","Respnse");
            }
        }

        @Override
        public void onFailure(Call<Result> call, Throwable t) {

            Log.v("@@@WWE","Failure ");
            Log.v("@@@WWE","MEssage "+t.getMessage());
        }
    });

完整的示例参考请访问 https://github.com/pratikvyas1991/NetworkingExample-master

【讨论】:

  • @Ammar 帮了大忙
  • 我无法更新到 Retrofit2,因为在这种情况下需要修改许多其他 API。我已经解决了这个问题。很快就会发布答案。
【解决方案2】:

固定如下;

使用RequestBody 时,Content-Length 标头没有携带正确的信息,我也无法覆盖它。所以,我使用TypedInput 而不是RequestBody。我的服务接口如下所示。

public static interface FileUploadService {
    @PUT("/")
    void upload(@Body TypedInput body, Callback<Object> callback);
}

图片上传为;

ServiceGenerator.getUploadService(url).upload(new TypedFile("image/*", file), 
                                              new Callback<Object>() { });

【讨论】:

    猜你喜欢
    • 2020-10-23
    • 2019-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-27
    • 2019-07-27
    • 2020-09-30
    • 2015-11-14
    相关资源
    最近更新 更多