如何获取AWS S3存储桶上传的文件的URL?

时间:2015-04-10 07:44:20

标签: java maven amazon-web-services amazon-s3 aws-sdk

我使用 Java Amazon AWS S3存储桶上传图像文件。

我正在使用以下maven依赖 -

    <dependency>
        <groupId>com.amazonaws</groupId>
        <artifactId>aws-java-sdk</artifactId>
        <version>1.9.28.1</version>
    </dependency>

我可以上传文件,也可以下载内容。但我想将图片网址返回给用户。

如何在s3存储桶上传后立即获取图片网址?

这是我的java代码 -

public void uploadProfile(InputStream fileInputStream, String fileName)  {      

        AmazonS3 s3client = new AmazonS3Client(new BasicAWSCredentials("MY-ACCESS-KEY", "MY-SECRET-KEY"));
        String bucketName = "MyBucket";
        String key = "MyKey";

        try {

            System.out.println("Listing buckets");
            for (Bucket bucket : s3client.listBuckets()) {
                System.out.println(" - " + bucket.getName());
            }
            System.out.println();

            System.out.println("Uploading a new object to S3 from a file\n");

            s3client.putObject(new PutObjectRequest(bucketName, key, fileInputStream, new ObjectMetadata()).withCannedAcl(CannedAccessControlList.PublicRead));

            System.out.println("Downloading an object");
            S3Object object = s3client.getObject(new GetObjectRequest(bucketName, key));
            System.out.println("Content-Type: "  + object.getObjectMetadata().getContentType());
            displayTextInputStream(object.getObjectContent());

            System.out.println("Listing objects");
            ObjectListing objectListing = s3client.listObjects(new ListObjectsRequest()
                    .withBucketName(bucketName)
                    .withPrefix("My"));
            for (S3ObjectSummary objectSummary : objectListing.getObjectSummaries()) {
                System.out.println(" - " + objectSummary.getKey() + "  " +
                                   "(size = " + objectSummary.getSize() + ")");
            }
            System.out.println();

         } catch (AmazonServiceException ase) {
            System.out.println("Error Message:    " + ase.getMessage());
            ase.printStackTrace();            
        } catch (AmazonClientException ace) {
            System.out.println("Error Message: " + ace.getMessage());
            ace.printStackTrace();
        }
    }

    private static void displayTextInputStream(InputStream input) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(input));
        while (true) {
            String line = reader.readLine();
            if (line == null) break;

            System.out.println("    " + line);
        }
        System.out.println();
    }

我试图点击网址:https://MyBucket.s3.amazonaws.com/myfilename

但它在xml中显示消息为 -

<Error>
   <Code>AccessDenied</Code>
   <Message>Access Denied</Message>
   <RequestId>64358C14C976A2CB</RequestId>
   <HostId>
      ZQ+DAaocOLxR/TmfEMGLcYm4Zk4Kl1vCKjciYiXKF1gYH5Lhj6oM4rd/o/4+SLVb
   </HostId>
</Error>

那么如何在上传s3存储桶后立即获取图片网址?

2 个答案:

答案 0 :(得分:1)

这是一个安全错误。您很有可能使用了良好的网址,但您无权访问该文件。您需要更改下载权限:每个人。然后,任何人都可以通过互联网访问该文件。 如果您不想这样做,那么您可以设置不同的权限,例如:经过身份验证的用户,然后您就可以从连接了正确的IAM用户的EC2实例访问该文件。

答案 1 :(得分:0)

您需要点击S3存储桶中的特定文件,并暂时选择公开选项。它可以从任何地方访问。