Android:使用AWS上传到私人存储桶后,媒体无法访问

时间:2017-09-21 06:13:23

标签: android amazon-s3 media amazon-cognito

在AWS上创建的存储桶是私有的。 使用专用访问模式上传时,我无法访问该文件。 使用以下方法上传媒体时成功上传。

从URL类获取URL的存储桶名称

    String bucketName = Util.getBucketNameFromUrl(uploadPath);
    String fileNameIncludingSubFolders = localPath.substring(localPath.lastIndexOf("/")+1);
    Uri mUri = Uri.parse(localPath);

上传到AWS的文件

File mFile = new File(mUri.toString().trim());

        AmazonS3Client s3Client = new AmazonS3Client(  Ut.getCredentialsCognito(context));
        PutObjectRequest por = new PutObjectRequest(bucketName, fileNameIncludingSubFolders, mFile);
        por.setProgressListener(new ProgressListener() {

            @Override
            public void progressChanged(ProgressEvent prgEvent) {
                if (progressUpdate != null) {
                    progressUpdate.progressStatus(String.valueOf(prgEvent.getBytesTransferred()));
                }
            }
        });

上传媒体文件时访问模式为私有

        try {
            por.setCannedAcl(CannedAccessControlList.Private);
            s3Client.putObject(por);
        } catch (Exception e) {
            e.printStackTrace();
        }

1 个答案:

答案 0 :(得分:1)

你所做的一切都很好。上传效果很好。
您唯一需要的是生成签名的URL 为此,请使用AWS开发工具包GeneratePresignedUrlRequest。这个类有很多方法,你也可以为链接和其他东西设置有效期。

AWSCredentials awsCredentials = new BasicAWSCredentials("ACCESS_KEY_ID", "SECRET_KEY_ID");
AmazonS3 s3client = new AmazonS3Client(awsCredentials );
GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketName, fileKey);
URL objectURL = s3client.generatePresignedUrl(request);

您可以按以下方式找到文件密钥和密钥名称:
 https://s3-[region]..amazonaws.com/[bucket name]/[file key]