【问题标题】:Downloading simple text/csv file in Chrome fails在 Chrome 中下载简单的文本/csv 文件失败
【发布时间】:2014-04-03 16:13:26
【问题描述】:

我正在尝试找出我们在下载时遇到的问题,该问题似乎只存在于 Chrome 中,并且只存在于 txt 和 csv 文件中。下载 zip 文件按预期工作。 IE 和 Firefox 适用于所有场景。 出于某种原因,Chrome 会在没有正确设置名称的情况下同时下载 txt 和 csv 文件。文件继承下载它们的页面的名称,并且没有扩展名 ()。

我有一个简单的 Web 表单,只有 3 个链接按钮,后面有一个相当简单的代码,为了这个问题,我对其进行了简化。

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

当我在网上搜索答案时,我尝试将内容类型切换为“文本/纯文本”或其他选项,但没有成功。我觉得我错过了一些东西,但我在网上找不到任何可以回答我问题的东西。 有谁知道为什么会发生这种情况?

感谢任何帮助。

【问题讨论】:

    标签: asp.net .net vb.net google-chrome webforms


    【解决方案1】:

    问题解决了。我想我应该在复制/粘贴时更加小心,因为这导致我 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()))
    

    那里多余的冒号是不必要的,当我删除它时 - 一切正常! 感谢所有帮助过的人!

    【讨论】:

      【解决方案2】:

      您需要将您的 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成功。

      【讨论】:

      • 我在发布之前已经尝试过了,这对 Chrome 没有任何影响。
      • 您好,感谢您的帮助。我不知道 WriteFile 选项,但这似乎也不起作用。更改为 Response.WriteFile(filename, False) 后,结果如下: CSV - 使用“默认”名称下载 Zip - 使用正确的名称和扩展名下载就好 Txt 显示以下内容:i.imgur.com/h8PVJPO.png
      • 您可以尝试对 MIME 类型使用 application/csvapplication/text,但这不是标准的一部分。它可能会给你你想要的文件名,但我不希望它起作用。
      • 这实际上也是我在发布之前尝试过的事情之一,但它不起作用,我没有在接受值列表中看到它。我想知道这是否是一个与 Chrome 相关的错误,因为在 IE 和 FF 中一切正常?我在搜索中发现了类似的东西 (stackoverflow.com/questions/11432538/…)。这不完全是我所面对的,但足够接近。你不觉得吗?
      • 看起来是这样。提到了"bug" in Chrome,它谈到对standard - Section 14 的解释更加严格。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多