1

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!

Mehdi Satei
  • 1,225
  • 9
  • 26

1 Answers1

0

i did this in my project like

  val key: String = AWS_DIRECTORY + fileFullName
      var transferUtility: TransferUtility? = null
      private var s3Client: AmazonS3? = null
      val region = Region.getRegion(Regions.AP_SOUTH_1)
      s3Client = AmazonS3Client(awsCredentials, region)
    transferUtility=TransferUtility.builder().s3Client(s3Client).context(activityContext)
                .defaultBucket(AWS_BUCKET)
                .build()

 val uploadObserver = transferUtility?.upload(
            AWS_BUCKET,
            key,
            file,
            CannedAccessControlList.PublicRead
        )

   uploadObserver?.setTransferListener(object : TransferListener {

                override fun onStateChanged(id: Int, state: TransferState) {
                    if (TransferState.COMPLETED == state) {

                       
                    } else if (TransferState.FAILED == state) {
                      
                    }
                }
                override fun onProgressChanged(id: Int, bytesCurrent: Long, bytesTotal: Long) {
                    }

                override fun onError(id: Int, ex: Exception) {
               
                }
            })