2012-02-17 112 views
1

我知道在互聯網歷史的某個地方,這個地方肯定有問題,但我似乎無法確定正確的術語來獲取回答我的需要。這個問題很近:What is the best way to store user uploaded files in a website?但我需要更多的細節。用ASP.NET網站和Visual Studio管理用戶上傳的文件

基本上,你應該如何有效地管理用戶上傳的文件,例如個人資料照片?我想知道的是關於WHERE製作目錄結構的一些「最佳實踐」。

上述問題的第二個答案提供了一些選項,例如將它們存儲在之外的網頁根目錄,這正是我最初想到的。但後來我開始思考......

1)我們如何保存數據庫中的路徑?絕對?相對?每個用戶都有一個「ProfilePicPath」列。如果我們想要將整個項目從一臺服務器完全拔除到另一臺服務器上,並且出於任何原因,我們無法將這些文件放在新服務器上的相同位置?每一個環節都會被打破。

2)應如何處理安全問題?假設我們已將我們的Web應用程序部署爲喜歡C:\ websites \ site1,但我們將用戶個人資料圖片存儲在類似C:\ usercontent \ profilepictures \中?在我們加載配置文件圖片的頁面上,我們如何安全地在後面的代碼中以編程方式訪問該代碼?我們不想把它們放在像C:\ websites \ site1 \ usercontent \ profilepictures \中,對嗎?我不喜歡將絕對路徑放入數據庫,我也不想在後面的代碼中的任何位置硬編碼路徑。

我們最初嘗試使用Web項目中的文件,但隨後它變成了一種風險,因爲這些用戶文件是我們項目的一部分。更新/修改網站時,一次錯誤的複製/粘貼,我們可能會覆蓋用戶上次從存儲庫中檢出項目後上傳的文件等。這是一個巨大的麻煩,整個場景只是向我尖叫,「你這個白癡,你這樣做都是錯誤的......「但我似乎無法找到一個合適的指導來做這件事」是正確的「。

要清楚的是,我們的需求是最小的 - 這只是一個小型項目供內部使用,不超過30個用戶,並且全部需要包含在一個IIS 7服務器上。

回答

2

1)我們如何保存數據庫中的路徑?絕對?相對?每個用戶都有一個「ProfilePicPath」列。如果我們想要將整個項目從一臺服務器完全拔除到另一臺服務器上,並且出於任何原因,我們無法將這些文件放在新服務器上的相同位置?每一個環節都會被打破。

相對。如果您希望這樣做,ProfilePicPath將簡單地存儲文件名。我有一個Web應用程序,我發現它更容易將圖片存儲在數據類型爲「image」的SQL列中。理由是圖片是應用程序數據的一部分,而不是應用程序的代碼,因此將其存儲在數據庫中。

2)應該如何處理安全問題?假設我們已將我們的Web應用程序部署爲喜歡C:\ websites \ site1,但是我們將用戶個人資料圖片存儲爲類似於C:\ usercontent \ profilepictures \?在我們加載配置文件圖片的頁面上,我們如何安全地在後面的代碼中以編程方式訪問該代碼?我們不想把它們放在像C:\ websites \ site1 \ usercontent \ profilepictures \中,對嗎?我不喜歡將絕對路徑放入數據庫,我也不想在後面的代碼中的任何位置硬編碼路徑。

在你的web.config有一個appSetting像這樣:

<add key="ProfilePicturePath" value="C:\usercontent\profilepictures\" /> 

而且你的代碼可以使用Path.Combine(s1, s2)到AppSetting與用戶數據庫ProfilePicPath值相結合。要提供圖像文件,您可以參考HTTP處理程序,例如<img src="Pic.ashx" />。下面是我用來從數據庫獲取圖像的代碼,但是如果您從文件夾獲取數據,則可以使用System.IO.File.Open()來從文件系統獲取流。

public class Pic : IHttpHandler 
{ 
    #region Properties 

    public bool IsReusable 
    { 
     get 
     { 
      return true; 
     } 
    } 

    #endregion 

    #region Implemented Interfaces 

    #region IHttpHandler 

    public void ProcessRequest(HttpContext context) 
    { 
     var userRecord = DAL.GetCurrentUser(); 

     if (userRecord != null) 
     { 
      byte[] picture = userRecord.ProfilePicture.ToArray(); 

      context.Response.ContentType = "image/jpeg"; 
      context.Response.OutputStream.Write(picture, 0, picture.Length); 
      context.Response.OutputStream.Close(); 
     } 
    } 

    #endregion 

    #endregion 
} 
+0

你是我的英雄。謝謝! – CptSupermrkt 2012-02-21 00:05:50

1

我做了我的Web Site

  1. 我創建了一個子域的地方,我可以訪問這些文件(如static.domain.com)
  2. 在我的主網站,我加了一些的appSettings在web.config像這些

    <add key="MainPath" value="http://static.domain.com/ImageDatabase/" /> 
        <add key="Profile" value="Profile/" />   
        <add key="Advertisements" value="Ads/" />   
    
  3. 的文件路徑,我創建一個返回可怕的一類ctory我需要得到一個特定的文件。 我將我的文件序列化爲鏈接到我的數據庫中具有名稱爲 photo_1的配置文件。PNG 其例如可能在檔案目錄中找到 所以當即時尋找相片爲帳戶ID的概要1 我只會叫我的課像這些

string ProfileDir = clsDirectory.GetProfileDirectory(); 

string filePath = ProfileDir + "photo_" + UserId + ".png"; 
相關問題