将图像上传到S3后如何获取公共网址?

时间:2016-01-25 13:04:58

标签: c# amazon-web-services amazon-s3

我正在开发一个C#应用程序,我将一些上传到AWS S3服务。我正在阅读文档,我无法找到上传后获取公共URL的位置。继承我的代码:

    public void AddFile(Stream image, string key)
    {          
            var uploadRequest = new TransferUtilityUploadRequest();
            uploadRequest.CannedACL = S3CannedACL.PublicRead;
            uploadRequest.InputStream = image;
            uploadRequest.BucketName = _bucket;
            uploadRequest.Key = key;

            using (TransferUtility fileTransferUtility = new TransferUtility(_client))
            {                 
                fileTransferUtility.Upload(uploadRequest);
            }            
    }

正如您所看到的,我使用 S3CannedACL.PublicRead 将访问权限设置为公共文件。所以它会像CDN一样,我知道亚马逊有CDN服务器的CloudFront服务,但我必须使用S3常规存储桶。

我想知道在上传方法之后是否可以获取固定网址。我只是可以在教程和文档上看到“PreSignedUrl”到期时间,但我不想要过期时间,我需要将这个URL保存在数据库中。

由于

3 个答案:

答案 0 :(得分:13)

您的应用程序应该使用一些配置/属性文件,其中存储存储桶的名称以供以后参考。例如,使用具有如下定义的属性的属性文件:

application.bucket=mybucket-example-com

在引用应用中的存储分区时(例如,在代码中将_bucket替换为application.bucket),,当您想表达或返回公众时,请使用此值URL。

如果您的应用已将文件上传到密钥userid/images/test.jpg,则公开网址可表示为:

https://[application.bucket].s3.amazonaws.com/[key]

这将解析为

的公共网址

https://mybucket-example-com.s3.amazonaws.com/userid/images/test.jpg

这种方法的优点在于,在测试环境中,您可以在测试配置中指定不同的存储桶。

在测试中,您可能希望使用application.bucket=test-mybucket-example-com

这样,在生产和测试环境之间切换时,您的代码不需要对此进行任何更改。

答案 1 :(得分:3)

您实际上可以根据存储桶名称和上传文件的路径构建此网址。有关访问存储桶的信息,请参阅此doc,其中描述了网址格式。

e.g:

http://bucket.s3.amazonaws.com/path/to/your/file
http://bucket.s3-aws-region.amazonaws.com/path/to/your/file
http://s3-aws-region.amazonaws.com/bucket/path/to/your/file

请注意,您的文件必须是公开的,否则您将获得权限被拒绝。

答案 2 :(得分:0)

不确定C#中的确切命令,但是在Java中,您可以使用getResourceUrl()获取上载的文件URL。类似的东西也将在C#中提供。

以下方法将文件上传到存储桶中特定文件夹中,并返回上传文件的生成网址。

private String uploadFileToS3Bucket(final String bucketName, final File file) {
    final String uniqueFileName = uploadFolder + "/" + file.getName();
    LOGGER.info("Uploading file with name= " + uniqueFileName);
    final PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, uniqueFileName, file);
    PutObjectResult putObjectResult = amazonS3.putObject(putObjectRequest);
    return ((AmazonS3Client) amazonS3).getResourceUrl(bucketName, uniqueFileName);
}