2015-09-05 23 views
0

我有一個文件,它是完整路徑(加上文件名)是在這個變量:的TransmitFile不工作

fileTemporary 

我想該文件下載到客戶端。

我這樣做:

HttpContext.Current.Response.TransmitFile(fileTemporary); 

,但沒有發生,我的意思是,當我按一下按鈕,這個文件執行,但沒有被下載到客戶端。我沒有看到客戶端瀏覽器上的任何文件。

請問我做了什麼錯誤?

+1

您是否在這一行上設置了斷點以確保它被擊中? 'fileTemporary'是否存在並且您是否正確指定了路徑?您的網站/應用程序是否有權訪問該文件和目錄?該文件是否爲空? –

+0

你使用什麼瀏覽器?我會使用FireBug,IE的F12網絡監視器或Fiddler來查看實際發送到瀏覽器的內容。在確認您在C#端沒有收到任何錯誤後,我會這樣做。 – dman2306

+0

@BobKaufman是的,我做了一個breakpint,它到達那裏。並且是fileTemporary存在。並首先我沒有permision,所以我得到的錯誤,我沒有該文件的權限,但後來我爲所有用戶的文件,然後我看到什麼都沒有被下載 –

回答

1

如果你使用MVC,您可以:

[HttpGet] 
     public virtual ActionResult GetFile(string fileTemporary) 
     { 
      // ...preparing file path... init fileTemporary. 

      var bytes = System.IO.File.ReadAllBytes(fileTemporary); 
      var fileContent = new FileContentResult(bytes, "binary/octet-stream"); 
      Response.AddHeader("Content-Disposition", "attachment; filename=\"YourFileName.txt\""); 

      return fileContent; 
     } 

如果使用ASP.NET或任何你可以用下面的(對不起,我的舊代碼,但是可以理解的做法):

var bytes = System.IO.File.ReadAllBytes(fileTemporary); 
SendFileBytesToResponse(bytes, fileName); 

public static bool SendFileBytesToResponse(byte[] bytes, string sFileName) 
     { 
      if (bytes!= null) 
      { 
       string downloadName = sFileName; 
       System.Web.HttpResponse response = System.Web.HttpContext.Current.Response; 
       response.Clear(); 
       response.AddHeader("Content-Type", "binary/octet-stream"); 
       response.AddHeader("Content-Disposition", 
            "attachment; filename=" + downloadName + "; size=" + bytes.Length.ToString()); 
       response.Flush(); 
       response.BinaryWrite(bytes); 
       response.Flush(); 
       response.End(); 
      } 

      return true; 
     } 

沒有reingeneering您的解決方案:

System.Web.HttpContext.Current.Response.Clear(); 

System.Web.HttpContext.Current.Response.AddHeader("Content-Type", "binary/octet-stream"); 
System.Web.HttpContext.Current.Response.AddHeader("Content-Disposition", 
       "attachment; filename=" + fileName); 

System.Web.HttpContext.Current.Response.TransmitFile(fileName); 

如果您想瀏覽器來解釋你的文件正確,你將需要指定標題「Content-Type」更精確。 請參閱list of content types

+0

什麼是pdfByte?第二pleasei有一個具體的問題,我沒有要求重新設計我的解決方案。 –

+0

使用你的代碼,我得到這個錯誤'未被捕獲的Sys.WebForms.PageRequestManagerParserErrorException:Sys.WebForms.PageRequestManagerParserErrorException:從服務器收到的消息無法解析。' –

+0

Marco,瀏覽器需要http頭。這樣瀏覽器可以解釋流。 –