2015-11-09 54 views
-1

我有兩個相同的圖像。一個保存爲文件夾中的.png,另一個保存爲數據庫中的SQLite blob。我試圖找出一個很好的方法來堅持這些圖像,並在需要時在我看來顯示它們。ASP MVC從SQLite db與文件系統獲取圖像

我有兩種嘗試將這些圖像放入我的視圖的方法。第一個是直接從文件系統讀取圖像文件,將它們轉換爲base64字符串,然後將其拖入ViewBag。此方法工作正常。

另一種方法是嘗試直接從數據庫加載圖像blob,然後從視圖中的模型中獲取圖像。這不太好。

通過幾個斷點,我發現base64字符串之間存在巨大差異,這取決於我的方法。我不確定SQLite圖像blob和我的文件系統中的.png之間的區別是什麼和什麼,以及任何幫助,將不勝感激,因爲將圖像保存在文件夾中看起來像額外的工作,當我可以把它們留在我的數據庫。從文件系統

加載:從SQLite的分貝

public string FirstImagePath(string slideid, int well) 
    { 
     var firstPath = HttpContext.Current.Server.MapPath(slideid); 
     byte[] firstImageByteData = File.ReadAllBytes(firstPath + "_first" + well + ".png"); 
     string firstImageBase64Data = Convert.ToBase64String(firstImageByteData); 
     string firstImageDataUrl = string.Format("data:image/png;base64,{0}", firstImageBase64Data); 

     return firstImageDataUrl; 
    } 

加載:

public byte[] FirstImage { get; set; } 
    public string FirstBase64Image 
    { 
     get { return ConvertImage(FirstImage);} 
    } 

    public string ConvertImage(byte[] imageBytes) 
    { 
     byte[] imageArray = imageBytes; 
     string imageBase64String = Convert.ToBase64String(imageBytes); 
     string imageDataString = string.Format("data:image/png;base64,{0}", imageBase64String); 

     return imageDataString; 
    } 
+1

不要將圖像存儲在數據庫中。他們不屬於那裏。將圖像存儲在磁盤上或雲存儲位置中。在數據庫中存儲一個URI。 – Necoras

回答

1

這兩種方法各有其優缺點。 如果您將圖像存儲在數據庫中,則可以非常容易地將應用程序移動到不同的平臺上,而無需複製大量圖像。另一方面,隨着時間的推移,你的數據庫將會變得非常龐大。 將圖像存儲在磁盤上允許您通過複製/粘貼作業等方式輕鬆覆蓋它們。但是,如果您有多個Web服務器,則必須多次進行此更改。 但是,這不是我用你的方法處理的主要問題。問題是你得到的圖像,將它們轉換爲base64並將它們嵌入到輸出中。由於很多原因,這是不好的做法。首先,瀏覽器足夠聰明,可以一次加載多個資源。例如,您的瀏覽器可以一次下載多個圖像,這將顯着提高頁面加載速度。如果嵌入了圖像,它將成爲html解析器的責任,以渲染這些圖像,從而減慢html文檔的整體下載速度,因爲它更大。

我會推薦兩者的混合。將圖像上傳到您的數據庫。在應用程序中創建一個圖像處理程序,從數據庫中檢索圖像並嘗試將其保存到文件系統。如果成功返回此圖片。下次您嘗試獲取此映像(並且它不會在用戶計算機上緩存)時,您的處理程序可以檢查文件系統以查看它是否已經創建並返回。 該方法爲您提供了數據庫和文件結構方法的優點。如果您決定需要10臺Web服務器,則所有圖像都將存儲在數據庫中,並且根據哪臺服務器接收請求,文件系統將自動填入圖像,並在需要時自動填充圖像。我建議爲你的圖像使用一個GUID或一些唯一的ID。

您甚至可以進一步擴展它,並將高度和寬度參數傳遞給圖像處理程序,它會在將圖像發送回客戶機之前調整圖像大小。

相關問題