我正在开发一个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保存在数据库中。
由于
答案 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);
}