PUT上传文件到AWS S3预签名url Retrofit2 Android

nt9*_*t95 8 android amazon-s3 kotlin retrofit retrofit2

我有一个来自 AWS S3 的预签名上传 URL,用于上传视频文件。在Postman上测试视频已成功上传。然而,在改造中实施时,我得到了 403 返回。我无法使用分段上传来完成此任务。

服务电话:

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

上传:

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

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

邮递员的屏幕截图

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

有什么建议么?

nt9*_*t95 9

解决方案是包含多部分并期望单一响应而不是 Call :

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

其中 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)
Run Code Online (Sandbox Code Playgroud)

  • 对于其他人来说,我遇到了同样的问题,建议的方法现在已被弃用,而且 Android 现在使用内容提供程序,使得访问底层文件变得很棘手,如果有兴趣,我在[此处](https://gutier.io/post 记录了我的解决方案/android-upload-file-to-aws-s3-bucket-with-retrofit2/) (5认同)