我正在构建一个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
我仍然不知道为什么。这条线不需要,所以我已经找到了修复,但如果有人知道发生了什么,我想听听它。
答案 0 :(得分:0)
对于CSV,Response.ContentType为“text / csv”。另外,尝试使用StreamWriter类来编写CSV。
答案 1 :(得分:0)
我猜它与UTF8编码有关 - 最后一个字符有点特殊,可能是EOF,然后它被编码为2个字节,接收器不会将其视为UTF8,但是理解除2字节字符外的所有内容。接收器(记事本?)将其视为每字符编码1字节(可能是普通的ascii)。
哦,我看到你的更新了。然后,虚假字节必须移动,足以得到虚假的最终0,但不足以破坏整个文件。
上次我不得不处理一个令人惊讶的编码的文件时,我尝试了所有可能的编码 - 一些产生完全混乱的文本,一些是可读的,一个是现货。
答案 2 :(得分:0)
我通过从响应标头禁用服务器重写规则,在IIS 8.5中解决了完全相同的问题。添加了行和PDF的PDF也是由SSRS(SQL Server Reporting Services)制作的。