2010-09-13 14 views
4

我有一个数据库,它将.png图像存储为sql“image”类型。我有一些代码将这些图像作为byte []检索,并通过.Net中的FileContentResult对象将它们发送到页面。性能是此应用程序的关键,并且图像必须尽快检索和显示。我的问题是,可以通过将数据库中的字节流传递给浏览器来更快地执行此操作,而不是在任何时候将整个字节数组存储在内存中。如果这是可行的和值得的,我该怎么做?使用流在C#中使用mssql获取图像

这里是我到目前为止的代码:

// 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(); 


     } 

感谢您的帮助!

回答

1

一个不错的问题。

现实是发送图像所需的代码,因为流是非常小的。它只是Response.Write ~~~字节数组,并设置HTTP的内容类型头部,它必须非常快。

现在你似乎需要打开你的数据库到世界上来更快地完成它。那很可能使用允许SQL服务器为IIS提供服务/与IIS交互的功能(很久以前我曾看过它),这不是一个好主意,所以我不相信你应该冒这个风险。

您已经在使用缓存,因此很酷,但文件很大,缓存会被频繁清除。

但有一件事做的是对IIS一个本地文件高速缓存,并且如果使用的图像,它是写入文件TEH Web服务器上,并从那时起(直到也许第二天,当这被清除)这个URL(静态资产)被返回,所以请求不必经过ASP.NET层。这不是一个好主意,但会以最小的风险实现你所需要的。

+0

好的。那真的是我想要的。我将在IIS缓存上做一些测试,看看它是否改善了处理。感谢所有的答复。 – shaw2thefloor 2010-09-13 13:20:37

+0

如果你这样做,我会建议你在高负载下做一些非常彻底的测试。 ASP.NET缓存很好,但是@Aliostad已经提到,它确实很满。考虑使用分布式的进程外高速缓存,如NCache,Memcached或Velocity,最好在专用的高速缓存服务器场中使用。 – 2010-09-13 13:29:21

1

编辑:根据你的意见,我认为你应该考虑使用微软的DeepZoom。本质上,这允许你做的是在服务器上生成一个专门的图像文件。当用户以全视图浏览图像时,屏幕上显示的几百万像素将通过AJAX发送到浏览器。然后,当用户放大时,放大级别和x轴和y轴的适当像素将流出。 有一个DeepZoom Composer可以通过命令行访问这些图像文件并按需将它们写入网络共享。你的用户将会非常感动。请参考this example。这是一个巨大的图像 - 千兆字节。在图像的中间,您会看到一些报纸页面。您可以放大并阅读文章。

编辑

末你必须有一个大的文件大小的图像?如果它们仅用于在浏览器中显示,则应为,针对网络进行了优化。所有主要的图像编辑应用程序都有这种能力

如果您确实需要较大的文件大小,那么您可以提供优化的图像,然后当用户单击图像时,允许它们下载完整文件。他们应该预计此下载需要一些时间。

在Photoshop中,任务是“Save for web”。 Gimp有一个类似命名的插件。

我知道这并不回答你的直接问题(“这个操作可以通过传递一个字节流来更快地执行”),但它可能有助于解决你的问题。

+0

嗨。感谢您的回应。图像是用户上传到系统的扫描结果,因此可以具有不同的大小和分辨率。 – shaw2thefloor 2010-09-13 12:04:28

+0

嗨。感谢您的回应。图像是用户上传到系统的扫描结果,因此可以具有不同的大小和分辨率。用户需要时刻放大图像,因此图像需要保持相当高的质量,因此这种优化可能不太合适。 – shaw2thefloor 2010-09-13 12:09:59

+0

好的。如果您希望用户能够快速查看扫描图库,那么缩略图方法会更好。根据用户上传到系统的内容,添加可自动生成优化图像的任务并不困难。然后,您可以在页面首次加载时显示优化后的图像,然后放大或下载高清图像,即可获得该图像。您的网站将会以更快的速度执行。 – 2010-09-13 12:14:10

1

如果PageId是主键,您可以安全地假设第一个和第一个将返回相同的结果,将linq从单个更改为第一个应该给您更好的SQL。