I am trying to upload files to s3 bucket but I am getting 400 Bad Request or file not found.
I have tried various solutions but still no luck.
Solution 1:
I followed this instructions
class InputStreamRequestBody(
private val contentResolver: ContentResolver,
private val uri: Uri
): RequestBody() {
override fun contentType(): MediaType? =
contentResolver.getType(uri)?.toMediaTypeOrNull()
override fun writeTo(sink: BufferedSink) {
contentResolver.openInputStream(uri)?.source()?.use(sink::writeAll)
}
override fun contentLength(): Long =
contentResolver.query(uri, null, null, null, null)?.use { cursor ->
val sizeColumnIndex: Int = cursor.getColumnIndex(OpenableColumns.SIZE)
cursor.moveToFirst()
cursor.getLong(sizeColumnIndex)
} ?: super.contentLength()
}
Used it like
@Multipart
@PUT
fun uploadFile(@Url url: String, @Part file: MultipartBody.Part): Single<Response<Any>>
val file = File(uri.path)
val requestBody = InputStreamRequestBody(contentResolver!!, uri)
val filePart = MultipartBody.Part.createFormData("file", file.name, requestBody)
packageApi.uploadFile(url, filePart)
This results in Bad Request
Solution 2:
Same as previous but this time without Multipart
@PUT
fun uploadFile(@Url url: String, @Body file: RequestBody): Single<Response<Any>>
val requestBody = InputStreamRequestBody(contentResolver!!, uri)
packageApi.uploadFile(url, requestBody)
This also results in Bad Request
Solution 3:
Now I abandoned InputStreamRequestBody
class and used the traditional way mentioned here
@Multipart
@PUT
fun uploadFile(@Url url: String, @Part file: MultipartBody.Part): Single<Response<Any>>
val file = File(uri.path)
val requestFile = file.asRequestBody("multipart/form-data".toMediaTypeOrNull())
val body = MultipartBody.Part.createFormData("file", file.name, requestFile)
packageApi.uploadFile(url, body)
This results in java.io.FileNotFoundException: /document/image:95: open failed: ENOENT (No such file or directory)
Any suggestion/solution is appreciated!