我按照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)
}
}