C# .net CSV文件流到浏览器在生产服务器上丢失字符

C# .net CSV文件流到浏览器在生产服务器上丢失字符,c#,browser,stream,download,C#,Browser,Stream,Download,我已经具备了将文件流式传输到浏览器的基本功能,浏览器将调用“另存为”。输出动态生成并存储在字符串中,而不是保存在服务器上的文件 请参阅下面的代码 string output = GenerateCSVDdata; Response.Clear(); Response.ClearHeaders(); Response.AddHeader("Content-Disposition", "attachment; filename=\"test.csv\"); Response.ContentType

我已经具备了将文件流式传输到浏览器的基本功能,浏览器将调用“另存为”。输出动态生成并存储在字符串中,而不是保存在服务器上的文件

请参阅下面的代码

string output = GenerateCSVDdata;
Response.Clear();
Response.ClearHeaders();
Response.AddHeader("Content-Disposition", "attachment; filename=\"test.csv\");
Response.ContentType = "application/octet-stream";
Response.BinaryWrite(System.Text.Encoding.UTF8.GetPreamble());
Response.Write(output);
Response.End();
现在,在我的开发服务器上,CSV完全下载。在生产服务器上,末尾的最后几个字符被截断。CSV越大,丢失的字符越多。我试过很多不同的方法,比如回复、冲水等等,但是没有什么能解决它。我唯一能做的就是把一堆空的木炭扔到头上,希望没有东西被割伤

这种不将文件保存到磁盘而将文件下载流式传输的方法是否有很大的问题


谢谢你的帮助。

试试这个,它对我有用

    void DownloadFile(string filename)
    {
            //string filename = "c:\\temp\\test.csv";
            byte[] contents = System.IO.File.ReadAllBytes(filename);

            Response.Clear();
            Response.ClearHeaders();

            Response.AppendHeader("Content-disposition", String.Format("attachment; filename=\"{0}\"", System.IO.Path.GetFileName(filename)));
            Response.AppendHeader("Content-Type", "binary/octet-stream");
            Response.AppendHeader("Content-length", contents.Length.ToString());


            Response.BinaryWrite(contents);
            if (Response.IsClientConnected)                
                Response.Flush();

    }

问候。

试试这个,它对我有用

    void DownloadFile(string filename)
    {
            //string filename = "c:\\temp\\test.csv";
            byte[] contents = System.IO.File.ReadAllBytes(filename);

            Response.Clear();
            Response.ClearHeaders();

            Response.AppendHeader("Content-disposition", String.Format("attachment; filename=\"{0}\"", System.IO.Path.GetFileName(filename)));
            Response.AppendHeader("Content-Type", "binary/octet-stream");
            Response.AppendHeader("Content-length", contents.Length.ToString());


            Response.BinaryWrite(contents);
            if (Response.IsClientConnected)                
                Response.Flush();

    }

注意。

您能确定您正在使用的.csv文件的字节计数是否有差异吗

byte[] defaultEncodingBytes = System.Text.Encoding.Default.GetBytes(defaultEncodingFileContents);
byte[] UTF8EncodingBytes = System.Text.Encoding.UTF8.GetBytes(defaultEncodingFileContents);

您能否确定正在使用的.csv文件的字节计数是否存在差异

byte[] defaultEncodingBytes = System.Text.Encoding.Default.GetBytes(defaultEncodingFileContents);
byte[] UTF8EncodingBytes = System.Text.Encoding.UTF8.GetBytes(defaultEncodingFileContents);

看起来BinaryWrite修复了它。你知道为什么吗?也许你的字符串和承诺的编码不一样?什么是“Response.BinaryWrite(System.Text.Encoding.UTF8.GetPreamble());”我在另一个线程上读它,如果我理解正确,它会帮助解码器确定字节顺序。Response.Charset和其他方法不起作用。你能确定.csv文件的计数是否有差异吗?我不能。最初,我是对字符串而不是字节数组执行内容长度。不知道这是否会造成差异。看起来像是BinaryWrite修复了它。你知道为什么吗?也许你的字符串和承诺的编码不一样?什么是“Response.BinaryWrite(System.Text.Encoding.UTF8.GetPreamble());”我在另一个线程上读它,如果我理解正确,它会帮助解码器确定字节顺序。Response.Charset和其他方法不起作用。你能确定.csv文件的计数是否有差异吗?我不能。最初,我是对字符串而不是字节数组执行内容长度。不知道这是否有区别。啊,是的,有区别。UTF8编码更大。解释为长度对于内容长度而言一定太短。谢谢是的,有区别。UTF8编码更大。解释为长度对于内容长度而言一定太短。谢谢