1

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

请参阅下面的代码。

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 越大,丢失的字符越多。我已经尝试了很多不同的东西,比如 Response.Flush 等,但没有什么能解决它。我唯一能做的就是在最后扔一堆空字符,希望没有任何东西被剪掉。

这种流式传输文件下载而不实际将文件保存到磁盘的方法有什么问题吗?

谢谢你的帮助。

4

2 回答 2

1

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

byte[] defaultEncodingBytes = System.Text.Encoding.Default.GetBytes(defaultEncodingFileContents);
byte[] UTF8EncodingBytes = System.Text.Encoding.UTF8.GetBytes(defaultEncodingFileContents);
于 2013-07-31T14:15:07.633 回答
0

试试这个,它对我有用。

    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();

    }

问候。

于 2013-07-31T12:47:33.703 回答