2011-06-18 35 views
0

我有一個使用MVC框架的asp.net web應用程序,該網站允許註冊商上傳一些標識文檔。asp.net網站應該在哪裏保存上傳的文件以及如何爲它們創建下載鏈接?

我要上傳這些文件最好的選擇:

  • 選項1 - 做一個目錄下的網站文件夾和網站的web.config文件保存它的名字,並保存文件的文件名中我的數據庫,所以當我想編寫下載鏈接時,我必須結合根URL和文件夾名稱以及文檔文件名稱 。

    例如http://www.website.com + 「/ DoucmentsFolder」 + 「/ Documentfilename」

  • 選項2 - 保存在數據庫中的每一個我需要下載文件時,整個文件,並且,我要救它到臨時文件夾並組成文件的鏈接,並確保在用戶獲得文件後刪除該文件。
  • 可能還有你的其他建議。

感謝

回答

4

與使用的FileStore的問題是多方面的:

1)清理 - 你需要離開你的文件中,有足夠長的請求,並收集,但你怎麼幹淨向上?如果你不這樣做,你會面臨空間不足的風險。最好的辦法是每隔一段時間運行一次計劃任務,並刪除比一小時更早的文件 - 但這仍然很麻煩。

2)不能很好地擴展 - 除非寫入SAN - 在網絡花園/農場場景中,用戶請求的文件可能與存儲該文件的服務器不同 - 除非您限制系統強制用戶的所有請求使用同一臺服務器。

3)不高效 - 與數據庫操作進行比較。

所以我會說數據庫肯定 - 這是比你說明要容易得多。

而不是創建一個文件,並給它一個鏈接,文件恢復爲FileContentResult:

public FileContentResult GetFile(int fileId) 
{ 
     myFile MyFile = fileRepository.Get(fileId); 
     return MyFile(file.Data, file.MimeType); 
    } 
} 

其中MyFile的樣子:

public class MyFile 
{ 
    public MyFile(byte[] fileData, string mimeType) 
    { 
     this.FileData = fileData; 
     this.MimeType = mimeType; 
    } 

    public virtual int Id {get; private set;} 
    public virtual byte[] FileData { get; set; } 
    public virtual string MimeType { get; set; } 
} 

存儲文件

[HttpPost] 
public ActionResult SaveFile(HttpPostedFileBase userFile) 
{ 
    MyFile myFile = new MyFile(new byte[userFile.ContentLength], userFile.ContentType) 
    userFile.InputStream.Read(MyFile.FileData, 0, userFile.ContentLength); 

    fileRepository.Save(myFile); 

} 
+0

偉大的解決方案,但我不知道如何確保只有人wh o上傳的文件是否允許下載?我想檢查記錄的用戶,這些用戶需要我將文件所有者的ID保存在文件信息中。 –

+0

只要擴展MyFile的定義以包含userId(或Role!),那麼您可以查詢userId是否匹配,或者用戶是否在角色等。 – BonyT

+0

好,這正是我想到的。 –

相關問題