aws-amplify / amplify-android

The fastest and easiest way to use AWS from your Android app.
https://docs.amplify.aws/lib/q/platform/android/
Apache License 2.0
245 stars 115 forks source link

TransferUtility.upload()'s TransferObserver or TransferListener should include the eTag of uploaded file #2926

Open kenyee opened 5 days ago

kenyee commented 5 days ago

Before opening, please confirm:

Language and Async Model

Kotlin, Kotlin - Coroutines

Amplify Categories

Storage

Gradle script dependencies

com-amazonaws = "2.77.0" com-amazonaws-aws-android-sdk-s3 = { module = "com.amazonaws:aws-android-sdk-s3", version.ref = "com-amazonaws" }

Environment information

N.A.

Please include any relevant guides or documentation you're referencing

https://docs.amplify.aws/android/build-a-backend/storage/upload-files/

Describe the feature request

The use case is that temporary credentials are used to upload to a server but we also need to include the eTag to make sure we have the latest version of a file. However, the credentials don't allow .getObject or .getObjectMetadata calls for security reasons.

Using TransferObserver, you get the id and state but not the eTag:

object : TransferListener {
                    override fun onStateChanged(
                        id: Int,
                        state: TransferState,
                    ) {
                        if (TransferState.COMPLETED == state) {
                            continuation.resume(state.name)
                        } else {
                            Timber.d("State changed to ${state.name}")
                        }
                    }

Please include the eTag in the onStateChanged parameters. Or include it in the fields of the TransferObserver when it's completed.

Initialization steps (if applicable)

No response

Code Snippet

// Put your code below this line.

amplifyconfiguration.json

No response

GraphQL Schema

```graphql // Put your schema below this line ```

Additional information and screenshots

No response

kenyee commented 5 days ago

Forgot to mention, this is what we currently do to upload a file to S3:

suspend fun uploadWithPutObject(
        ioDispatcher: CoroutineDispatcher,
        s3Client: AmazonS3Client,
        s3Bucket: String,
        s3FileKeyName: String,
        file: File,
    ): String =
        withContext(ioDispatcher) {
            s3Client.putObject(s3Bucket, s3FileKeyName, file).eTag
        }
phantumcode commented 4 days ago

Thanks for submitting the feature request. Our team will prioritize the request and provide updates here.