我有一个数据库,它存储.png图像作为sql“image”类型。我有一些代码将这些图像作为byte []检索,并通过.Net中的FileContentResult对象将它们发送到页面。性能是此应用程序的关键,必须尽快检索和显示图像。我的问题是,通过将字节流从数据库传递到浏览器,可以更快地执行此操作,而不是在任何时候将整个字节数组存储在内存中。如果这是可能且值得做的,我该怎么做?
这是我到目前为止的代码:
// Get: /Image/Get/5
public FileResult Get(int id)
{
Response.Cache.SetExpires(DateTime.Now.AddSeconds(300));
Response.Cache.SetCacheability(HttpCacheability.Public);
Response.Cache.SetValidUntilExpires(true);
// Get full size image by PageId.
return base.File(page.getFullsizeImage(id), "image/png");
}
和
public byte[] getFullsizeImage(int pageId)
{
return (from t in tPage
// Filter on pageId.
where t.PageId == pageId
select t.Image).Single().ToArray();
}
感谢您的帮助!
答案 0 :(得分:1)
修改:根据您的评论,我认为您应该考虑使用微软的DeepZoom。基本上,这允许您做的是在服务器上生成专门的图像文件。当用户在全视图中浏览图像时,屏幕上显示的几百万像素将通过AJAX发送到浏览器。然后,当用户放大时,缩放级别和x和y轴的适当像素被流出。 可以通过命令行访问DeepZoom Composer以按需生成这些图像文件并将其写入网络共享。您的用户会留下深刻的印象。
看看this example。这是一个巨大的形象 - 技嘉。在图像的中间,你会看到一些报纸页面。您可以直接放大并阅读文章。
编辑结束
您是否需要具有大文件大小的图像?如果它们仅用于在浏览器中显示,则应针对网络进行优化。所有主要的图像编辑应用程序都具备此功能。
如果确实需要较大的文件大小,则可以提供优化的图像,然后当用户单击图像时,允许他们下载完整的文件。他们应该期待这个下载需要一些时间。
在Photoshop中,任务是“Save for web”。 Gimp有一个类似命名的插件。
我知道这不能回答你的直接问题(“通过传递字节流可以更快地执行此操作”),但它可能有助于解决您的问题。
答案 1 :(得分:1)
将linq从单个更改为第一个应该可以为您提供更好的SQL,如果PageId是您可以首先安全地假设的主键,则单个将返回相同的结果。
答案 2 :(得分:1)
一个很好的问题。
Reality是发送图像所需的代码,因为流非常小。它只是Response.Write ~~~字节数组并设置HTTP的内容类型标题,它必须非常快。
现在,您似乎需要向全世界开放数据库,以便更快地完成任务。那可能是使用允许SQL服务器提供HTTP /与IIS交互的功能(很久以前我看过它),这不是一个好主意,所以我不相信你应该冒这个风险。
您已经在使用缓存,因此很酷但文件很大,缓存会经常被清除。
但要做的一件事就是在IIS上安装本地文件缓存,如果使用了图像,则写入网络服务器上的文件并从然后开启(直到第二天清除它)这个其他URL(到静态资产)被返回,因此请求不必通过ASP.NET层。这不是一个好主意,但会以最小的风险实现您的需求。