2013-04-10 66 views
1

我在构建一个csv文件并将其发送到浏览器。在某些安装中,额外的字符被添加到http响应主体的开始处,并且销毁该文件。csv文件中的额外字符

这就是我的代码的样子。

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

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

0

我猜它与UTF8编码有关 - 最后一个字符是某种特殊的,也许是一个EOF,然后它被编码为2个字节,并且接收器不会将其视为UTF8,但了解除2字节字符以外的所有内容。接收器(记事本?)将其视为每个字符编码的1个字节(可能是普通的ascii)。

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

我最后一次与一个令人惊讶的编码文件的工作,我尝试了所有可能的encodings--一些产生完全搞砸了的文字,有些是有点可读,一个是点之一。

0

我已经通过禁用响应头中的服务器重写规则解决了在IIS 8.5中完全相同的问题。添加了行并且也是PDF碎片的CSV由SSRS(SQL Server Reporting Services)制作。