将文件上传到AWS S3预签名网址Retrofit2 Android

时间:2019-03-14 12:07:42

标签: android amazon-s3 kotlin retrofit retrofit2

我从AWS S3有一个预先签名的上传URL,用于将视频文件上传到。在邮递员上测试,视频已成功上传。但是,当实施改造时,我得到了403返回。我不能为此任务使用分段上传。

服务电话:

@Headers("Content-Type: video/mp4")
    @PUT
    fun uploadTaskAWS(@Url awsUrl: String, @Body filePart: RequestBody): Call<ResponseBody>

上传:

            val file = File(task.file_path)
            val requestFile = RequestBody.create(MediaType.parse("video/mp4"), file)
            val response = awsTaskUploadService.uploadTaskAWS(task.upload_url, requestFile)

我确保URL正确。内容类型标头也被添加,附加了邮递员屏幕截图。遇到403禁止错误

screenshot of postman

我发现了这个相关问题,但是我仍然收到403。Upload a file to AWS S3 pre-signed URL using Retrofit2

有什么建议吗?

2 个答案:

答案 0 :(得分:0)

403错误表示服务器知道您是谁,但无权执行所需的操作。

如果正确生成了预签名URL,则应该可以在没有任何身份验证的情况下进行上传。

您可以检查邮递员是否默认将任何AWS身份验证添加到请求中

如果上传到仅使用版本4的区域,则在签署请求时还需要显式设置协议版本。

答案 1 :(得分:0)

解决方案将包括多部分内容,并且期望单一响应而不是呼叫:

  @Multipart
    @PUT
    fun uploadAsset(
        @Header(CONTENT_TYPE) contentType: String,
        @Url uploadUrl: String,
        @Part file: MultipartBody.Part
    ): Single<ResponseBody>

传入contentType的地方

val requestFile = RequestBody.create(MediaType.parse(contentType), file)
val body = MultipartBody.Part.createFormData(mediaType, task.file_name, requestFile)
assetService.uploadAsset(contentType, task.upload_url, body)