我按照this创建了一个测试桶(打开公共访问权限)。
现在,我可以使用上面链接中给出的方法和python脚本成功上传,但是我无法通过Kotlin应用程序执行相同的操作。

Python代码:

import boto3
from botocore.client import Config

ACCESS_KEY_ID = ********
ACCESS_SECRET_KEY = ***********
BUCKET_NAME = ********

data = open('bitmoji.png', 'rb')
data = open('b_f_a0008.wav', 'rb')

s3 = boto3.resource(
    's3',
    aws_access_key_id=ACCESS_KEY_ID,
    aws_secret_access_key=ACCESS_SECRET_KEY,
    config=Config(signature_version='s3v4')
)
s3.Bucket(BUCKET_NAME).put_object(Key='b_f_a0008.wav', Body=data)

print ("Done")


Kotlin代码:

private fun upload() {
        val s3Client = AmazonS3Client(BasicAWSCredentials(awsAccessKey, awsSecretKey))
        s3Client.setRegion(Region.getRegion(Regions.US_EAST_2))

        val transferUtility = TransferUtility.builder()
            .context(context)
            .awsConfiguration(AWSMobileClient.getInstance().configuration)
            .s3Client(s3Client)
            .build()

        val transferObserver = transferUtility.upload(awsBucketName, "test.mp3", File(filePath))

        transferObserver.setTransferListener(object : TransferListener {
            override fun onProgressChanged(id: Int, bytesCurrent: Long, bytesTotal: Long) {
                activity!!.runOnUiThread {
                    activity!!.showToast(Constants.TOAST_UPLOAD_SUCCESS + bytesTotal.toString())
                }
            }

            override fun onStateChanged(id: Int, state: TransferState?) {
                activity!!.runOnUiThread {
                    activity!!.showToast(Constants.TOAST_UPLOAD_SUCCESS + state?.name)
                }
            }

            override fun onError(id: Int, ex: Exception?) {
                activity!!.runOnUiThread {
                    activity!!.showToast(Constants.TOAST_EXCEPTION + ex?.message)
                }
            }
        })
    }


println(transferObserver.absoluteFilePath)-> / storage / emulated / 0 / 26-Dec-2019 4:22:49 PM.mp3
println(transferObserver.bytesTotal)-> 4750

请让我知道我在做什么错。

最佳答案

此解决方案有效

private fun uploadToS3() {
        val credentials = BasicAWSCredentials(awsAccessKey, awsSecretKey)
        val transferManager = TransferManager(credentials)
        val upload = transferManager.upload(awsBucketName, filename, File(filePath))
        val uploadResult = upload.waitForUploadResult()

        while (!upload.isDone){
            val bytesTransferred = upload.progress.bytesTransferred
            println(bytesTransferred.toString())
            Thread.sleep(200)
        }
    }

07-24 09:39
查看更多