2010-09-13 15 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。