【发布时间】:2014-07-24 07:17:39
【问题描述】:
我在尝试从 amazon s3 下载文件时遇到问题。我有文件存储在 amazom s3 上,要访问这些文件,用户需要经过身份验证。我正在尝试找到一种流式传输文件的方法,而无需将每个文件从亚马逊下载到我的服务器,然后从我的服务器下载到最终客户端。我只是希望能够通过生成 url 直接流式传输文件,您能提出一些想法吗?
【问题讨论】:
标签: c#-4.0 amazon-web-services amazon-s3 amazon
我在尝试从 amazon s3 下载文件时遇到问题。我有文件存储在 amazom s3 上,要访问这些文件,用户需要经过身份验证。我正在尝试找到一种流式传输文件的方法,而无需将每个文件从亚马逊下载到我的服务器,然后从我的服务器下载到最终客户端。我只是希望能够通过生成 url 直接流式传输文件,您能提出一些想法吗?
【问题讨论】:
标签: c#-4.0 amazon-web-services amazon-s3 amazon
我知道这是一个老问题,但我有针对这种确切情况的解决方案。
基本上,您希望以强制下载而不是在浏览器窗口中打开的方式将存储在 Amazon S3 上的文件呈现给用户的浏览器。通常,如果您将文件本地存储在服务器上,那么这很容易做到。但是,您不希望首先将文件从 S3 下载到您的服务器,然后再将其发送到客户端,所以...
您需要安装 Amazon S3 开发工具包,您可以在此处从 Nuget 获得:https://www.nuget.org/packages/AWSSDK.S3/
另外,请确保您引用了这些命名空间:
using Amazon;
using Amazon.S3;
using Amazon.S3.Model;
这是我用来在 Amazon S3 上强制下载远程文件的代码:
byte[] buffer = new byte[4096];
GetObjectRequest getObjRequest = new GetObjectRequest {
BucketName = "**yourbucketname**",
Key = "**yourobjectkey**"
};
IAmazonS3 client = new AmazonS3Client("**youraccesskeyid**", "**yoursecretkey**", RegionEndpoint.EUWest2); //< set your own region
using (GetObjectResponse response = client.GetObject(getObjRequest))
using (Stream stream = response.ResponseStream)
{
int bytesRead = 0;
Response.AppendHeader("Content-Disposition", "attachment; filename=" + Path.GetFileName(response.Key));
Response.AppendHeader("Content-Length", response.ContentLength.ToString());
Response.ContentType = "application/force-download";
while ((bytesRead = stream.Read(buffer, 0, buffer.Length)) > 0 && Response.IsClientConnected)
{
Response.OutputStream.Write(buffer, 0, bytesRead);
Response.OutputStream.Flush();
buffer = new byte[4096];
}
}
与往常一样,我确信有更好的方法来实现这一点,但这段代码对我有用。
【讨论】:
AWS 为 .Net 提供 SDK,可让他们下载(和上传文件)。 例如这里:http://ceph.com/docs/master/radosgw/s3/csharp/
一个快速的谷歌应该会给你答案。如果有什么具体的事情你不能做,那么请再解释一下你的问题。
【讨论】: