2013-04-10 100 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)製作。