none
網頁產生檔案下載與HTTP壓縮後的問題 RRS feed

  • 問題

  • 因為系統需要針對每個登入的使用者產生專屬的檔案供下載,
    小弟之前是在A.aspx中做一個檔案連結,
    使用者按下連結後Submit到B.aspx,
    然後B頁面中用ASPX產生要給使用者資料流,
    最後用以下語法輸出
    With Response
    .AddHeader("content-disposition", "attachment; filename=C.txt")
    .ContentType = "application/save-as"
    .Write(DataString)
    .Flush
    End With
    然後畫面上就會出現詢問使用者是否要下載C.txt。

    之前一切運作OK,
    只是小弟當啟動IIS的HTTP壓縮後(確定是因為這個造成的,因為關掉HTTP壓縮就正常了),
    這個網頁輸出的檔案變成了B.aspx(不過內容還是C.txt的資料),
    不過在IE7中不會有這個問題(IE6才會這樣,使用IE6 SP3),
    不知道有沒有前輩有類似的經驗呢?
    因為這個輸出檔案還蠻重要的,
    還是說有辦法單獨讓這一個網頁不壓縮就送到Client端呢?

    另外,

    使用WINDOW.OPEN的視窗是否能輸出檔案呢?

    因為小弟將輸出檔案的程式碼寫在裡面時,

    視窗開啟後就直接關閉了,

    完全沒有任何動作,

    真是很困擾阿。


    煩請各位前輩指教,謝謝!

    2008年11月18日 上午 01:45

解答

  • 一切以 RFC 定義的規格為主。RFC 並沒有定義 application/save-as ,也沒有哪個附加檔註冊 MIME 資訊是這個。

    RFC 速查網站:

    http://www.faqs.org/rfcs/

     

    如果有問題,改用 telnet yourserver 80 直接下命令測,當你的 Content-disposition 無法辨識時,有可能發生錯誤。

     

    有依照 KB 用 IIS6 Resource Kits 的 Metabase Explorer 設定動態壓縮 gzip / deflate ,我試是沒問題,我有用 IE6 SP2 試過,沒特別找 WinXP SP3 來試,不過用戶有用 WinXP SP3 ,沒有反應有問題,還有用 Win2k + IE6 的也都正常。

    2008年11月18日 下午 01:48
  • 1. 你可以不啟用「壓縮應用程式檔案」試試。如下圖示:

     

     

    基本上,瀏覽器遇到不認識的 Content-Type 是預設會變成「下載檔案」,照理說 IE 是可以下載的,但是根據每個人電腦設定的不同,的確是有些人的電腦會「直接開啟」或「直接顯示在頁面上」。

     

    2. 你如果要下載檔案,建議用 <a href="xxx" target="_blank"> 的方式,不要用 window.open

    2008年11月19日 上午 06:45

所有回覆

  • 誰告訴你這樣用啊?

     

    Code Snippet

    Public Function SetResponseHeader(Byval sContentType As String, Byval sFileName As String, Optional Byval bSaveFile As Boolean = False)
          Dim sContentDisposition As String

          With Response
           If bSaveFile Then
            sContentDisposition = "attachment; " ' 強制存檔,未設定則依瀏覽器預設開啟或存檔
           End If
           
       If Len(sFileName) > 0 Then
        .HeaderEncoding = System.Text.Encoding.GetEncoding("big5")
        sContentDisposition = sContentDisposition & "filename=" & sFileName ' 檔名
       End If

           If Len(sContentDisposition) > 0 Then
            .AddHeader("Content-disposition", sContentDisposition)
           End If

           .ContentType = sContentType
          End With

       End Function

     

     

    2008年11月18日 上午 06:20
  • 上述的語法是小弟從GOOGLE上找來的,

    主要看到的是兩種做法,

    一個是檔案實際存在主機上,

    這時會使用Response.writeFile(File)來輸出檔案,

    另一種就是即時產生資料流然後輸出就是這個問題的作法,

    實際上,

    輸出檔案的方式,

    當我的頁面環境是 IIS6+IE6 時輸出時它所出現的下載的檔名是我那隻產生資料的頁面名稱,

    但是,如果是在IIS7+IE6 or IIS6+IE7時都是正確無誤的,

    而最主要的問題是,

    當我IIS6不啓用動態壓縮時輸出就會正常,

    但是啟用動態壓縮後就會有這種問題出現,

    所以才想說不知道有沒有前輩有類似的經驗可以協助解決這樣的窘境。

    2008年11月18日 上午 08:25
  • 一切以 RFC 定義的規格為主。RFC 並沒有定義 application/save-as ,也沒有哪個附加檔註冊 MIME 資訊是這個。

    RFC 速查網站:

    http://www.faqs.org/rfcs/

     

    如果有問題,改用 telnet yourserver 80 直接下命令測,當你的 Content-disposition 無法辨識時,有可能發生錯誤。

     

    有依照 KB 用 IIS6 Resource Kits 的 Metabase Explorer 設定動態壓縮 gzip / deflate ,我試是沒問題,我有用 IE6 SP2 試過,沒特別找 WinXP SP3 來試,不過用戶有用 WinXP SP3 ,沒有反應有問題,還有用 Win2k + IE6 的也都正常。

    2008年11月18日 下午 01:48
  • 1. 你可以不啟用「壓縮應用程式檔案」試試。如下圖示:

     

     

    基本上,瀏覽器遇到不認識的 Content-Type 是預設會變成「下載檔案」,照理說 IE 是可以下載的,但是根據每個人電腦設定的不同,的確是有些人的電腦會「直接開啟」或「直接顯示在頁面上」。

     

    2. 你如果要下載檔案,建議用 <a href="xxx" target="_blank"> 的方式,不要用 window.open

    2008年11月19日 上午 06:45