我正在开发一个 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) URLhttps://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/