我们需要使用基于.net的Web应用程序,该应用程序将使用应用程序的管理面板将文件上载到Amazon S3存储桶,客户端将获得带有 client.aspx
文件的可下载文件 .
我们查看了一些示例,并对从S3存储中下载非公共文件的一些示例代码感到困惑 . 一个这样的例子如下
AmazonS3Config config = new AmazonS3Config()
{
RegionEndpoint = RegionEndpoint.USEast1
};
IAmazonS3 client = new AmazonS3Client(accessKey, secretKey, config);
string dest = System.IO.Path.GetTempPath() + "event.mp4";
using (client)
{
GetObjectRequest request = new GetObjectRequest() { BucketName = "bucketname" + @"/" + "videos2015", Key = "event.mp4" };
using (GetObjectResponse response = client.GetObject(request))
{
response.WriteResponseStreamToFile(dest);
}
}
Response.Clear();
Response.AppendHeader("content-disposition", "attachment; filename=" + "dynamic_filename.png");
Response.ContentType = "application/octet-stream";
Response.TransmitFile(dest);
Response.Flush();
Response.End();
当用户点击链接后,代码在Web服务器上执行,代码在Web服务器上下载文件,然后将相同的文件提供给客户端...如果我没有错 . 我们是否可以直接从AWS S3存储中提供文件供下载 .
在上述情况下,它浪费了服务器资源并且还增加了下载时间 .
AWS上的Out文件不是Public,它们不是公共的,因此无法直接从客户端浏览器访问url,就像公共内容类型一样
2 回答
预先签名的网址确实是您正在寻找的 . 由于您使用的是C#,因此以下是一些有用的代码示例的链接:
http://docs.aws.amazon.com/AmazonS3/latest/dev/ShareObjectPreSignedURLDotNetSDK.html
无需通过您的网络服务器将文件上传到s3,它们可以直接发送 . 下载同样的东西,直接从S3下载 - 不要先将它们复制到EC2,否则会浪费带宽和处理资源 .
您可以使用Minio-dotnet client library其开源并支持兼容的S3 API .
以下是PresignedPostPolicy的示例
PresignedPutObject以下
希望能帮助到你 .
PS:我为Minio工作