2009-06-06 36 views
5

我在FILESTREAM中將圖像存儲在我的數據庫中,我正試圖找出最佳解決方案是如何將該圖像返回到Web瀏覽器。什麼是將圖像從SQL中的FILESTREAM流式傳輸到瀏覽器的最快捷方式?

如果我管理的文件系統上的文件我自己,最快捷的方法也只是:

Response.TransmitFile(pathToFile); 

這並不傳送回客戶端(我的理解)之前將文件加載到內存中而且這樣很好,很快。

我目前使用Linq to SQL來獲取FILESTREAM。這提供了FILESTREAM作爲二進制對象。

迄今做的這個相當醜陋的方式:

Response.WriteBinary(fileStreamBinary.ToArray()); 

難道我會是最好不要用困擾的LINQ to SQL和更直接地做事情?

我開始想知道爲什麼我首先對FILESTREAM感到困擾,並不僅僅是自己管理文件。我敢肯定,沒有使用「流浪漢」這個詞是有原因的!

回答

1

這不將文件加載到內存傳送回 客戶端(我的理解)之前,因此是很好的和快速的。

正確,但記得將Response.BufferOutput設置爲false,默認值爲true。

我會更好嗎沒有打擾Linq to SQL,並更直接地做事?

如果您不想將整個二進制內容首先加載到內存中,那麼是的。這裏的an example用於從數據庫流式傳輸二進制數據(以及啓用可恢復下載功能)。

我開始想知道爲什麼我在第一 地方FILESTREAM困擾,並沒有只是堅持管理文件自己

主要好處是事務性的支持和包容數據的完整性在數據庫備份中,所以您不必擔心數據庫備份和文件系統備份之間的差異。缺點一直是性能,這是整個文件流功能正在努力克服的問題。儘管根據this document它們平均小於1mb,但它實際上比在文件系統中更快地存儲在數據庫中。

在Sql Server 2012中,有一個名爲FileTables的新功能,它基於FileStream支持。基本上,它就像一個文件系統目錄的數據庫視圖,因爲添加到該目錄的文件會自動添加到數據庫FileTable(是一個固定的模式表,其中包含文件的Filestream二進制列,可以從其他表)。這將允許您檢索文件的路徑,您可以將其添加到您的Response.TransmitFile(...)函數中,但仍受益於sql Filestream支持。

1

那該怎麼辦?

byte[] buffer = new byte[bufferSize]; 
int nBytes; 
while((nBytes = fileStreamBinary.Read(buffer, 0, bufferSize) != 0) 
{ 
    Response.OutputStream.Write(buffer, 0, nBytes); 
} 

這樣,你永遠不會整個流加載到內存

+0

嗯,也許我們正在談論不同的二進制對象類型 - Linq返回一個System.Data.Linq.Binary對象,它沒有Read()方法:( – joshcomley 2009-06-06 01:28:00

0

基本上相同的思路提出了托馬斯,但有點冗長。 應該關閉緩衝區並定期提交/刷新數據,以避免在發送到客戶端之前緩衝所有傳入數據。

我使用類似的代碼流數據(在這種情況下全文:S)在數據庫從斑點 - >WCF服務(流) - >客戶(瀏覽器)

這對於較小的項目可能不是最好的方法,但對於傳輸來自某種流的東西很有用。

Response.Clear(); 
Response.ContentType = "application/pdf"; 
Response.Buffer = false; 

var buffer = new byte[BufferSize]; 
int bytesRead; 
while ((bytesRead = inputStream.Read(buffer, 0, BufferSize)) != 0) 
{ 
    if (!Response.IsClientConnected) 
      break; 

    Response.OutputStream.Write(buffer, 0, bytesRead); 
    Response.Flush(); 
} 
相關問題