2011-08-04 85 views
2

我試圖從管理員端將文件上傳到像CMS這樣的文件夾。 前端將顯示下載文件的鏈接。 在管理員端,我不僅想刪除引用,還要從服務器中刪除實際的文件。從ASP.NET MVC3中的服務器刪除上傳的文件

這裏是我的控制器的一部分將上傳的文件:

[HttpPost] 
public ActionResult Upload(HttpPostedFileBase file) 
{ 
    if (file != null && file.ContentLength > 0) 
    { 
     var fileName = Path.GetFileName(file.FileName); 
     var path = Path.Combine(Server.MapPath("~/App_Data/uploads"), fileName); 
     file.SaveAs(path); 

     ViewBag.fileName = fileName.ToString(); 

     return RedirectToAction("Create", new {fileName = fileName }); 
    } 

    return RedirectToAction("Index"); 
} 

Create視圖,管理員隨後允許進入有關文檔的其他細節,並存儲在連同表文件名。

現在我需要能夠鏈接到文檔名稱,如document.pdf。我甚至可以鏈接到App_Data文件夾下的上傳文件夾?

另外,如何刪除文件而不是刪除表格行?

+0

我最終這樣做的PDF,它「工作」,但想知道如果我需要擔心任何內存問題等或FileStreamResults處理一切? 'public ActionResult Document(string fileName){try {var fn = fileName; var fpath = Path.Combine(Server.MapPath(「〜/ App_Data/uploads」),fn);返回新的FileStreamResult(新的FileStream(fpath,FileMode.Open,FileAccess.Read,FileShare.Read),「application/pdf」); } ...' – Par6

+0

這取決於您的網絡應用遇到多少流量。你有多少用戶? –

+0

@亞歷內部員工大多使用。基本上沒有太多的流量。但是如果我要創造更公開的東西,你有沒有指向最佳實踐的信息?再次感謝你的幫助。 – Par6

回答

1

創建一個單獨的控制器來處理文件的下載。它還可以防止用戶直接鏈接到文件。

public ActionResult GetDocument(String pathName) 
{ 
    try 
    { 
     Byte[] buffer = DownloadMyFileFromSomeWhere(pathName); 
     FileContentResult result = new FileContentResult(buffer, "PDF"); // or whatever file ext 
     // these next two lines are optional 
     String[] folders = pathName.Split(new char[] { '\\' }, StringSplitOptions.RemoveEmptyEntries);    
     result.FileDownloadName = folders[folders.Length - 1]; 

     return result; 
    } 
    catch (Exception ex) 
    { 
     // log the error or something 
    } 
    return new HttpNotFoundResult(); 
} 

DownloadMyFileFromSomeWhere(string)應該能夠從像斑點,甚至在本地服務器某些存儲檢索字節數組文件。它可以是這個樣子:

private Byte[] DownloadMyFileFromSomeWhere(string pathname) 
{ 
    Byte[] file = System.IO.File.ReadAllBytes(Server.MapPath(pathname)); 
    return file; 
} 

對於管理方面,你可以做同樣的辦法:寫一個單獨的控制器刪除的文件和數據庫中的條目。

+0

你能詳細說明一下DownloadMyFileFromSomeWhere()可能看起來像什麼或有一個對另一篇文章的引用。謝謝, – Joe

+0

@Joe,它可能是一個簡單的獲取您的web服務器中的本地文件或從blob或雲下載。首先看看'System.IO.File.ReadAllBytes(filePath);'例如。 –

+1

我在你的答案中添加了一個DownloadMyFileFromSomeWhere方法。 – Joe

0

一些注意事項:

  • 如果你有權利保存文件的地方,你也應該有刪除的權利。您可以使用普通文件操作來執行此操作。
  • IIS 阻止您鏈接到App_Data下的文件。你有兩個選擇:
    • 創建讀取該位置的文件和流回在不同的位置,瀏覽器
    • 商店的行爲 - 在某個地方用戶將真正有機會獲得。

第一選項的好處是,你可以輕鬆地添加認證等,以你的行動,以確保對文件的訪問,而第二個選項將要求您在添加一個web.config具有適當角色和訪問權限的文件夾。但是,另一方面,您必須在您的操作方法中提供適當的標頭,以便瀏覽器知道如何處理該文件,而不是讓IIS爲您解決問題。

相關問題