我有基本的功能,可以将文件流式传输到调用"另存为"的浏览器。输出是动态生成的,并存储在字符串中,而不是保存在服务器上的文件中。
请参阅下面的代码。
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.Flash等,但没有什么能解决它。我唯一能做的就是在最后扔一堆空字符,希望没有什么能被剪掉。
这种在没有将文件保存到磁盘的情况下流式下载文件的方法有什么问题吗?
谢谢你的帮助。
您能确定您正在使用的.csv文件的字节计数是否存在差异吗?
byte[] defaultEncodingBytes = System.Text.Encoding.Default.GetBytes(defaultEncodingFileContents);
byte[] UTF8EncodingBytes = System.Text.Encoding.UTF8.GetBytes(defaultEncodingFileContents);
试试这个,它对我有用。
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();
}
谨致问候。