2016-04-21 87 views
2

我有一個可以使用控制器訪問的網絡驅動器。例如「\ mydrive \ filestorage」。我希望用戶能夠下載存儲在此服務器上的文件。這意味着我無法使用url,因爲這些文件不在Web服務器根目錄中。我也無法爲這個驅動器設置一個Web服務器,除了使用控制器讀取文件並以這種方式下載文件外,我沒有其他方式可以訪問這些數據。使用ASP從遠程服務器下載文件MVC

我發現了一些教程來做它的服務器上的文件,但我不能讓它在使用遠程文件時工作。我想要一個下載鏈接,點擊它並下載文件。下面是代碼我有

public ActionResult DownloadFile(string id) 
{ 
    UploadedDocument document = new UploadedDocument(Int32.Parse(id)); 
    string filecontents = System.IO.File.ReadAllText(document.FilePath); 
    string filetype = Helpers.GetMimeType(document.FilePath); 
    return File(filecontents, filetype); 
} 

我得到下面的異常

System.IO.DirectoryNotFoundException:找不到 路徑「的一部分,C:\的Inetpub \ wwwroot文件...

filepath變量將是網絡驅動器的路徑。

\\Netdrive\Uploads\somefile.txt 

文件內容和文件類型的2個變量正在填充正確。返回文件時拋出異常。當我在調試模式下運行代碼時,2個變量填充如下。

filecontents = "test\r\n" 
filetype = "text\plain" 
+0

是什麼'document.FilePath'的價值? – Jamiec

+0

網絡共享路徑始終以'\\'開頭,而不是'\'開頭。這是一個錯字嗎? –

+0

有2個斜槓,評論標籤是刪除第一個。 –

回答

3

File(string, string)期望一個文件名和MIME類型,但你傳遞文件的內容爲字符串。

直接從您的網絡驅動器提供服務的文件,以這樣的方式

public ActionResult DownloadFile(string id) 
{ 
    UploadedDocument document = new UploadedDocument(Int32.Parse(id)); 
    string filetype = Helpers.GetMimeType(document.FilePath); 
    return File(document.FilePath, filetype); 
} 

要強制下載文件(並繞過默認瀏覽器設置文件的處理,例如,在瀏覽器中顯示PDF),添加一個文件名作爲文件方法的第三個參數:

return File(document.FilePath, filetype, "myFileName.pdf"); 
+0

這不下載文件。它在一個新的瀏覽器窗口中打開文件 –

+1

這是因爲該文件是由您的瀏覽器處理的,並且它會自動選擇如何處理它。如果你想*強制*下載文件,那麼使用'File'方法重載3個字符串參數:'返回File(document.FilePath,filetype,「myFileName.pdf」);',使用最後一個參數作爲文件名。 –

+0

這個伎倆。由於另一個答案被標記爲低效生病,請將此投票作爲正確答案。謝謝您的幫助 –

-1

請使用以下代碼下載文件中的MVC

public ActionResult Download() 
     { 
      var filepath = @"\\Netdrive\Uploads\somefile.txt"; 
      byte[] filedata = System.IO.File.ReadAllBytes(filepath); 
      string contentType = MimeMapping.GetMimeMapping(filepath); 
      var cd = new System.Net.Mime.ContentDisposition 
      { 
       FileName = filepath, 
       Inline = false, 
      }; 
      Response.AppendHeader("Content-Disposition", cd.ToString()); 
      return File(filedata, contentType); 
     } 
+1

請注意,通過這種方式,您將整個文件內容加載到內存中,然後再次將其轉換爲流。這是服務大文件的一種非常低效的方式,並浪費無用的內存。 –

+2

請不要轉儲「固定」代碼,但請解釋您更改的內容。 – CodeCaster

1

直接下載文件,你可以做簡單的

return File(path of file, System.Net.Mime.MediaTypeNames.Application.Octet, name:file will be download using this name); 

在控制器方法

爲例 下載文件:http://localhost:60494/Content/Audio/123456.mp3

var audio_path = "/" + path.Substring(path.IndexOf("Content")); 
    String audio_name = path.Substring(path.LastIndexOf("/") + 1); 
    return File(audio_path, System.Net.Mime.MediaTypeNames.Application.Octet, audio_name);