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
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 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)
403 error means the server knows who you are but do not have the authority to perform the desired action.
If the pre-signed URL is correctly generated, you should be able to upload without any authentication.
You can check if postman is by default adding any AWS Authentication to request
Also you need to explicitly set the protocol version while signing requests if uploading to a region that uses only version 4.