2008-12-03 92 views
6

我有一個存儲一些文件的sql數據庫。C#ASP.NET 3.5內容處理文件下載問題

用戶可以登錄到應用程序,並查看其文檔列表。

當在文檔的gridview中點擊鏈接按鈕下載時,我從數據庫中獲取文件,將其寫入文件系統,然後執行此代碼。

System.IO.FileInfo file = new System.IO.FileInfo(System.Configuration.ConfigurationManager.AppSettings["UploadPath"] + DocumentName); 

    Response.Clear(); 
    Response.ClearContent(); 
    Response.ClearHeaders(); 
    Response.Cookies.Clear(); 
    Response.Cache.SetCacheability(HttpCacheability.Private); 
    Response.CacheControl = "private"; 
    Response.Charset = System.Text.UTF8Encoding.UTF8.WebName; 
    Response.ContentEncoding = System.Text.UTF8Encoding.UTF8; 
    Response.AppendHeader("Content-Length", file.Length.ToString()); 
    Response.AppendHeader("Pragma","cache"); 
    Response.AppendHeader("Expires", "60"); 
    Response.ContentType = GetContentType(file.Extension); 
    Response.AppendHeader("Content-Disposition", 
    "inline; " + 
    "filename=\"" + file.Name + "\"; " + 
    "size=" + file.Length.ToString() + "; " + 
    "creation-date=" + DateTime.Now.ToString("R") + "; " + 
    "modification-date=" + DateTime.Now.ToString("R") + "; " + 
    "read-date=" + DateTime.Now.ToString("R")); 

我的getContentType()方法只是返回相應的文件類型,我讓「應用程序/ PDF格式,應用/ msw0rd的文件等

我的問題是,當文件被保存,這是網頁本身,而不是文件系統中的文件,而在谷歌瀏覽器中,它將擴展名放在文件名的末尾,我猜是因爲它知道它是一個網頁?

無論如何,一步是獲得實際的文件,而不是他們坐在HTML中的網頁的副本!

謝謝。

回答

9

你是如何發送文件的實際內容?

我通常使用Response.TransmitFile方法,它基本上打開文件並將其內容發送到Response.OutputStream

3

您是否嘗試將內容設置設置爲「附件」而不是「內聯」?我相信瀏覽器會提示用戶打開或保存文檔。

此外,您通常可以通過將數據庫中的字節流直接寫入帶有BinaryWrite方法的Response對象來繞過文件系統......這也是您可能想要使用HTTP Handler進行調查的情況一個ASPX頁面,以便您不必擔心清除響應等。過去我曾在頁面上使用隱藏的iframe,然後使用Javascript將其src設置爲接收文檔的HTTP Handler ID作爲QueryString上的參數。

9

代替

Response.AppendHeader( 「內容處置」, 「內聯;」 + 「文件名=

使用

Response.AddHeader(」 內容處置:」, 「attachment; filename =