c# - 将图像上传到 S3 后如何获取公共(public) URL?

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

我正在开发一个 C# 应用程序,我在其中将一些内容上传到 AWS S3 服务。我正在阅读文档,但在上传后找不到从哪里获取公共(public) 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 常规存储桶。

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

最佳答案

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

application.bucket=mybucket-example-com

在您的应用程序中引用存储桶时使用此值(例如,在您的代码中将 _bucket 替换为 application.bucket),你想表达或返回公共(public) URL。

如果你的应用已经上传了一个文件到keyuserid/images/test.jpg,那么public URL可以表示为:

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

这将解析为

的公共(public) URL

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

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

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

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

关于c# - 将图像上传到 S3 后如何获取公共(public) URL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34993366/

相关文章:

amazon-web-services - AWS S3 预签名 URL,无到期日

image - 托管网站图像: Flickr PRO, Amazon S3还是...?

.htaccess - 具有干净 URL 且没有 .htaccess 文件的单页应用程序?

c# - 在 VBscript 中捕获控制台应用程序的返回码?

c# - C# 事件实现(文章与反射器)

C# 查询 - 非静态方法需要目标

C# 如何在不使用 WMI 的情况下查询 Windows DNS 服务器的 rrecord

amazon-web-services - 使用 Swift 进行 Amazon AWS DynamoDB 查询的最佳方式?

amazon-web-services - 安全组定义中不允许自引用

amazon-web-services - AWS 为 Lambda 创建 Cloudformation 日志警报