2014-03-02 84 views
0

我想弄清楚我們正在面對的下載問題,並且問題似乎只存在於Chrome中,並且僅適用於txt和csv文件。正如預期的那樣下載zip文件。 IE和Firefox適用於所有場景。 由於某些原因,Chrome無需正確設置名稱即可下載txt和csv文件。文件繼承從下載的頁面的名稱,並且沒有擴展名(see screenshot)。在Chrome中下載簡單的文本/ csv文件失敗

我有一個簡單的Webform只有3個linkbuttons一個相當簡單的代碼背後,我簡化了這個問題。

Imports System.IO 

Public Class _Default 
    Inherits Page 

    Private Const FILE_PATH_CSV As String = "D:\Temp\Download\testFile.csv" 
    Private Const FILE_PATH_ZIP As String = "D:\Temp\Download\testFile.zip" 
    Private Const FILE_PATH_TXT As String = "D:\Temp\Download\testFile.txt" 

    Private Sub btnDownloadCSV_Click(sender As Object, e As EventArgs) Handles btnDownloadCSV.Click 
     Dim file As New FileInfo(FILE_PATH_CSV) 
     If Not file.Exists() Then 
      Throw New Exception("No file") 
     End If 
     Try 
      DownloadFile(file) 
     Catch ex As Exception 
      'TODO: Log! 
     End Try 
    End Sub 

    Private Sub btnDownloadTXT_Click(sender As Object, e As EventArgs) Handles btnDownloadTXT.Click 
     Dim file As New FileInfo(FILE_PATH_TXT) 
     If Not file.Exists() Then 
      Throw New Exception("No file") 
     End If 
     Try 
      DownloadFile(file) 
     Catch ex As Exception 
      'TODO: Log! 
     End Try 
    End Sub 

    Private Sub btnDownloadZIP_Click(sender As Object, e As EventArgs) Handles btnDownloadZIP.Click 
     Dim file As New FileInfo(FILE_PATH_ZIP) 
     If Not file.Exists() Then 
      Throw New Exception("No file") 
     End If 
     Try 
      DownloadFile(file) 
     Catch ex As Exception 
      'TODO: Log! 
     Finally 
      With Response 
       .Flush() 
       .End() 
      End With 
     End Try 
    End Sub 

    Private Sub DownloadFile(ByVal file As FileInfo) 
     With Response 
      .Clear() 
      .ClearHeaders() 
      .ClearContent() 
      .Buffer = True 

      Response.ContentType = GetContentType(file) 
      Response.AddHeader("Content-Disposition:", String.Format("attachment;filename=""{0}""", file.Name.ToString())) 
      Response.AddHeader("Content-Length", file.Length.ToString()) 
      Response.TransmitFile(file.FullName) 
     End With 
    End Sub 

    Private Function GetContentType(ByVal file As FileInfo) 
     Select Case file.Extension.ToLower() 
      Case ".txt", ".csv" 
       Return "application/octet-stream" 
      Case ".zip" 
       Return "application/x-zip-compressed" 
      Case Else 
       Return "application/octet-stream" 
     End Select 
    End Function 
End Class 

我試過將內容類型切換到「text/plain」或其他選項,因爲我在網上搜索了答案但沒有運氣。我覺得我錯過了一些東西,但是我找不到任何能夠在線回答我的問題的東西。 有沒有人有任何想法,爲什麼這可能會發生?

任何幫助表示讚賞。

回答

0

問題已解決。我想我應該更加小心複製/粘貼,因爲這導致了我2天非常沮喪的調試。

Response.AddHeader("Content-Disposition:", String.Format("attachment;filename=""{0}""", file.Name.ToString())) 

應該

Response.AddHeader("Content-Disposition", String.Format("attachment;filename=""{0}""", file.Name.ToString())) 

額外的冒號在那裏是沒有必要的,當我刪除它 - 一切正常! 感謝所有幫助!

1

您需要將MIME類型更改爲correct values

 Case ".csv" 
      Return "text/csv" 
     Case ".txt" 
      Return "text/plain" 

您可能還需要從

 Response.TransmitFile(file.FullName) 

發送文件的方法更改爲

 Response.WriteFile(file.FullName, False) 

在MSDN上的文檔是不清楚的差異之間的什麼兩種方法。我從未使用TransmitFile,但已成功使用WriteFile

+0

我已經試過,甚至在發佈之前,它對Chrome沒有任何影響。 – DaRussian

+0

嘿,謝謝你的幫助。我不知道WriteFile選項,但這似乎也不起作用。 改變到Response.WriteFile後(文件名,FALSE)的結果如下: CSV - 與「默認」的名字 郵編下載 - 下載就好了使用正確的名稱和擴展 TXT顯示以下:http://i.imgur.com/h8PVJPO.png – DaRussian

+0

你可以嘗試爲MIME類型使用'application/csv'或'application/text',但這不是標準的一部分。它可能會給你你想要的文件名,但我不希望它能起作用。 –