2009-09-12 67 views
1

我以下文件下載代碼:IIS7下載文件長度

 FileInfo fileInfo = new FileInfo(filePath); 

     context.Response.Clear(); 
     context.Response.ContentType = "application/octet-stream"; 
     context.Response.AddHeader("Content-Disposition", "attachment; filename=" + System.IO.Path.GetFileName(filePath)); 
     context.Response.AddHeader("Content-Length", fileInfo.Length.ToString()); 
     context.Response.WriteFile(filePath); 
     context.Response.End(); 

當我在我的本地IIS6運行它,它工作正常。在我開始下載文件之前,Web瀏覽器(在IE8,Firefox 3.5.2,Opera 10上測試)顯示文件長度。

當我在遠程IIS7上運行此代碼時,Web瀏覽器不顯示文件長度。文件長度未知。

爲什麼我在IIS7下運行此代碼時沒有獲取文件長度?

回答

3

使用Fiddler檢查實際發送的內容。我的猜測是,由於在IIS7服務器上將緩衝設置爲false,您正在獲得分塊編碼。

順便說一句,放棄Response.End調用它相當有創造性的事情做,是不必要的(就此而言,呼叫清除)。

編輯

與分塊編碼(這是希望在您的方案)的Content-Length頭應該不存在(見RFC2616 Section 4.4)。在我看來,那IIS7在需要它流媒體內容時,嚴格地說本身來執行這一點。事實上,我有一個Classic-ASP場景,其中IIS7在緩衝關閉時嘗試添加Content-Length標頭時會引發錯誤。

這真的很煩人,因爲儘管象牙塔中的委員會想要什麼,但這個標題給最終用戶一個非常有用的信息。

+0

是的,我得到「transfer-encoding:chunked」和Content-Length不返回。有什麼辦法獲得響應頭中的Content-Length?我沒有直接訪問IIS7服務器。 – GTD 2009-09-12 20:48:26

0

感謝您的這篇文章....我得到它的IE與第一行工作。

 
public void WriteCSV(string strData) { 
    //Required for IIs7 WS2008R2 fix 
    Response.ClearHeaders(); 
    Response.Clear(); 


    Response.Buffer = true; 
    Response.ContentType = "application/csv"; 
    Response.AddHeader("Content-Disposition", "attachment;filename=report.csv"); 
    Response.Write(strData); 
    Response.Flush(); 
    Response.End(); 
}