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

gog*_*gog 6 c# amazon-s3 amazon-web-services

我正在开发一个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);
            }            
    }
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢

Rod*_*o M 16

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

application.bucket=mybucket-example-com
Run Code Online (Sandbox Code Playgroud)

在引用应用程序中的存储桶时(例如_bucket,application.bucket在代码中替换)以及要表达或返回公共URL时,请使用此值.

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

https://[application.bucket].s3.amazonaws.com/[key]
Run Code Online (Sandbox Code Playgroud)

这将解析为公共URL

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

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

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

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

  • 注意:在 2019 年 3 月 20 日之后启动的区域中创建的存储桶无法通过 https://bucket.s3.amazonaws.com 命名方案访问。 (2认同)

Tom*_*Tom 5

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

例如:

https://bucket.s3.amazonaws.com/path/to/your/file
https://bucket.s3-aws-region.amazonaws.com/path/to/your/file
https://s3-aws-region.amazonaws.com/bucket/path/to/your/file
Run Code Online (Sandbox Code Playgroud)

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

注意:路径样式 (https://s3-aws-region.amazonaws.com/bucket/path/to/your/file现已弃用,不应再使用