【问题标题】:Uploading file as public to S3 in Kotlin Android在 Kotlin Android 中将文件作为公共上传到 S3
【发布时间】:2019-03-19 03:28:39
【问题描述】:

我正在使用 Kotlin 开发一个 Android 应用程序。我正在尝试将文件上传到 AWS S3 存储桶。我可以成功地将文件上传到存储桶。但问题是该文件是作为私有文件上传的。相反,我希望它也被上传并公开。

这是我的代码

private fun uploadPhotoToS3(path : String){
        doAsync {
            AWSMobileClient.getInstance().initialize(applicationContext).execute()

            val s3Client = AmazonS3Client(AWSMobileClient.getInstance().credentialsProvider)
            val transferUtility = TransferUtility.builder()
                    .context(applicationContext)
                    .awsConfiguration(AWSMobileClient.getInstance().configuration)
                    .s3Client(s3Client)
                    .build()
            val uploadObserver = transferUtility.upload("public/testing.jpg", File(path))

            uploadObserver.setTransferListener(object : TransferListener{
                override fun onStateChanged(id: Int, state: TransferState?) {
                    if(TransferState.COMPLETED == state){
                        Log.i("UPLOAD_STATE", "COMPLETED")
                    } else {
                        Log.i("UPLOAD_STATE", "CHANGED")
                    }
                }

                override fun onProgressChanged(id: Int, bytesCurrent: Long, bytesTotal: Long) {

                }

                override fun onError(id: Int, ex: Exception?) {
                    Log.i("UPLOAD_ERROR", "Unable to upload file")
                }
            })
        }
    }

如何修改它以将文件设置为公开?

【问题讨论】:

    标签: android amazon-web-services amazon-s3 kotlin


    【解决方案1】:

    参考:https://github.com/aws/aws-sdk-android/blob/master/aws-android-sdk-s3/src/main/java/com/amazonaws/mobileconnectors/s3/transferutility/TransferUtility.java#L476

    val uploadObserver = transferUtility.upload("public/testing.jpg", File(path), CannedAccessControlList.PublicRead)
    

    附加

    我尝试了上述解决方案。但它返回 403 错误。我不得不使用带有访问密钥和秘密密钥的 AWS 基本凭证提供程序,而不是使用 cognito 凭证提供程序。

    【讨论】:

    • 收到此错误。 10-15 23:19:19.599 29558-29833/com.thegoodyard.waiyanhein.thegoodyard E/UploadTask: 分段上传时遇到错误: 4 由于拒绝访问 (服务: Amazon S3; 状态代码: 403; 错误代码: AccessDenied;请求 ID:2348F3C66BE0BAB3) com.amazonaws.services.s3.model.AmazonS3Exception:访问被拒绝(服务:Amazon S3;状态代码:403;错误代码:AccessDenied;请求 ID:2348F3C66BE0BAB3),S3 扩展请求 ID:OuzolfzNeNAHvlDq3SdeU8FoYjy7vqPRDB3e tZC3GfGjI5lKlwxaestkPA2oXpOk=
    【解决方案2】:

    【讨论】:

    • 但是,我怎么可能在 Kotlin 中做到这一点?甚至找不到它的方法或参数。
    • 我的答案链接到 Android 的文档。
    • val uploadObserver = transferUtility.upload("public/testing.jpg", File(path), CannedAccessControlList.PublicRead) Ref: github.com/aws/aws-sdk-android/blob/master/aws-android-sdk-s3/…
    • 收到此错误。 10-15 23:19:19.599 29558-29833/com.thegoodyard.waiyanhein.thegoodyard E/UploadTask: 分段上传时遇到错误: 4 由于拒绝访问 (服务: Amazon S3; 状态代码: 403; 错误代码: AccessDenied;请求 ID:2348F3C66BE0BAB3) com.amazonaws.services.s3.model.AmazonS3Exception:访问被拒绝(服务:Amazon S3;状态代码:403;错误代码:AccessDenied;请求 ID:2348F3C66BE0BAB3),S3 扩展请求 ID:OuzolfzNeNAHvlDq3SdeU8FoYjy7vqPRDB3e tZC3GfGjI5lKlwxaestkPA2oXpOk= –
    • 这个答案是否解决了您的问题?您有一种设置访问控制的方法,而您的新问题(与此问题无关)正在处理权限设置不正确。
    【解决方案3】:

    关于“拒绝访问”错误:尝试使用aws-sdk-android-s3 2.7.3 而不是最新的2.7.5。该问题在此处跟踪https://github.com/aws/aws-sdk-android/issues/548

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-04
      • 2021-04-27
      • 2016-07-11
      • 2015-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多