使用流从C#中的mssql中获取图像

时间:2010-09-13 11:45:32

标签: c# asp.net sql-server asp.net-mvc image

我有一个数据库,它存储.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();


        }

感谢您的帮助!

3 个答案:

答案 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层。这不是一个好主意,但会以最小的风险实现您的需求。