【问题标题】:In a C# .NET web application, can I download an Amazon S3 object directly into memory and serve it as an image?在 C# .NET Web 应用程序中,我可以将 Amazon S3 对象直接下载到内存中并将其作为图像提供吗?
【发布时间】:2012-01-31 14:48:54
【问题描述】:

使用 AWS .NET 开发工具包,我可以将 S3 对象(.jpg 图像文件)直接下载到内存中吗?我确定我在几个月前看到了解决此问题的方法,但现在找不到了。

假设我可以将文件直接下载到内存中,那么我是否可以使用

将图像提供给客户端
context.Response.Write(memoryStream object);

感谢您的帮助。我知道你可能在想,你为什么要这样做?为什么不直接链接到文件?这是一个复杂的原因,我只是暂时保持简单。干杯!

【问题讨论】:

  • 我不确定这是否能回答您的问题,但我正在创建文件,所以我拥有它们。谢谢!
  • 如果您使用的是 AWS .net 开发工具包,这里有人与您有同样的问题stackoverflow.com/questions/2455454/…
  • 谢谢——这正是我想要的。我很好奇@Randolpho,你认为使用 .NET SDK 比标准的 HttpWebRequest 更快吗?
  • @Hairgami_Master 更快?不,它们会差不多。 SDK 只会抽象出构建 URL 并为您获取数据。

标签: c# asp.net amazon-s3


【解决方案1】:

您当然可以从其他来源获取数据并将其加载到内存中,但您必须以某种方式获取数据。

很可能会采用网络抓取的形式。您可以使用HttpWebRequest 到 S3 对象的 URL 轻松获取数据,将数据读入内存流,然后将数据写入响应流。我建议您跳过内存流步骤并从您的 S3 获取响应中进行缓冲读取并写入您的 ASP.NET 响应。

这种方法有一些注意事项。首先,如果您的 S3 对象不可公开访问,您必须解决安全问题。其次,当您获取此数据时,您的初始 ASP.NET 请求将暂停,这将增加将图像获取到浏览器的延迟,这可以通过简单地链接到对象来轻松修复。

例如:

// Assuming url is the  url to the S3 object.
var buffer = new byte[1024*8]; // 8k buffer. 
var request = (HttpWebRequest)WebRequest.Create(url);
var response = request.GetResponse();
int bytesRead = 0;
using (var responseStream = response.GetResponseStream())
{
    while((bytesRead = responseStream.Read(buffer, 0, buffer.Length)) != 0)
    {
         Response.OutputStream.Write(buffer, 0, bytesRead);
    }
}

【讨论】:

  • 感谢@Randolpho-我拥有这些图像并且可以将它们公开。您认为这种方法比使用 AWS .NET API 更快/更慢吗?干杯。
  • 就原始速度而言,通过 AWS SDK 拉取对象将与我提到的方法大致相同。事实上,鉴于您列出的场景,您将使用上面的大部分代码——您唯一需要替换的是var request = ...var response = ... 行。如果速度是您最担心的问题,请找到一种方法将图像公开并在您的 HTML 中链接到它们。我知道你已经说过你不能这样做,但这是让它更快的唯一方法。
  • 再次感谢@Randolpho。我最终使用了你的例子。我试图让 AWS .NET 包装器工作,但由于某种原因我做不到。干杯!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-14
  • 2014-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多