Search code examples
androidamazon-s3kotlinretrofitretrofit2

PUT upload file to AWS S3 presigned url Retrofit2 Android


I have a pre-signed upload URL from AWS S3 to upload a video file to. Testing on Postman the video is successfully uploaded. However i get a 403 returned when implementing in retrofit. I cannot use multipart upload for this task.

service call :

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

upload:

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

I have ensured the URL is correct. The content type header is added too, postman screenshot attached. Getting 403 Forbidden Error

screenshot of postman

I have found this related question however i'm still getting a 403. Upload a file to AWS S3 pre-signed URL using Retrofit2

Any suggestions?


Solution

  • solution was to include multipart and expect Single response not Call :

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

    where contentType is passed in

    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)