1

我正在构建一个 csv 文件并将其发送到浏览器。在某些安装中,额外的字符会添加到 http 响应正文的开头,它会破坏文件。

这就是我的代码的样子。

Dim File As New Text.StringBuilder
File.Append("Batch Name,")
File.Append("Batch Accepted Total")
File.AppendLine

For Each Batch In Batches
    File.Append(Batch.Name)
    File.Append(",")
    File.AppendFormat("{0:c}", Batch.AcceptedTotal)

    File.AppendLine
Next

Dim FileName = "SomeFile.csv"
Dim Encoder = Text.Encoding.UTF8
Dim FileData = Encoder.GetBytes(File.ToString)

Response.Clear
Response.ClearHeaders
Response.Buffer = True
Response.AddHeader("Content-Disposition", "attachment;filename=" & FileName)
Response.ContentType = "text/plain"
Response.OutputStream.Write(FileData, 0, FileData.Length)
Controller.FileData = Nothing
Response.Flush
Response.End

只有一些安装会这样做,而其他安装则不会。我不知道为什么。如果我交换数据库,同一个站点仍然存在问题。所以我知道它不依赖于数据。

这就是文件最终的样子

781
Batch Name,Batch Accepted Total
3/8/2013,$961.24
Lincoln Payroll,$999.99

0

第一行的 718 发生了变化。它接缝取决于文件的大小。最后多余的 0 永远不会改变,我也不知道它来自哪里。

更新: 我发现第一行是十六进制预期内容的长度。删除此行也将删除多余的字符。

Response.Flush

我仍然不知道为什么。不需要那条线,所以我已经完成了寻找修复的工作,但是如果有人知道发生了什么,我想听听。

4

3 回答 3

0

我猜它与 UTF8 编码有关——最后一个字符有点特殊,可能是一个 EOF,然后它被编码为 2 个字节,接收器不会将其视为 UTF8,但除了2 字节字符。接收器(记事本?)将其视为每个字符编码 1 个字节(可能是普通的 ascii)。

哦,我看到你的更新了。然后,虚假字节必须四处移动,足以得到虚假的最终 0,但不足以破坏整个文件。

上次我不得不处理一个具有令人惊讶的编码的文件时,我尝试了所有可能的编码——一些产生了完全混乱的文本,一些是可读的,一种是现货。

于 2013-04-11T21:07:53.013 回答
0

对于 CSV,Response.ContentType 是“text/csv”。另外,尝试使用StreamWriter类来编写 CSV。

于 2013-04-11T20:56:00.140 回答
0

通过禁用响应标头中的服务器重写规则,我在 IIS 8.5 中解决了完全相同的问题。带有添加行和损坏的 PDF 的 CSV 由 SSRS(SQL Server Reporting Services)制作。

于 2015-08-07T07:35:44.007 回答