好的,所以我有一个页面,它从web服务中获取文件作为Byte [],然后我给用户保存/取消对话框以保存该文件。该文件可以是xml或cvs格式。下载文件时,文件不完整,例如这是文件应该具有的内容:
美元,欧元,欧元,1.2,1.1,11 / 15 / 2009,15:23:27个
美元,澳元,澳大利亚,1.25,1.15,11 / 15 / 2009,15:23:27
但是当从浏览器中保存时它只有::
美元,欧元,欧元,1.2,1.1,11 / 15 / 2009,15:23:27个
USD,AUD,澳大利亚,1.25,1。
这是我的代码:
Response.Buffer = true;
Response.AddHeader("Content-Disposition", "attachment;filename=" + fileName);
Response.AddHeader("Content-Length", MyFile.Length.ToString());
FileInfo file = new FileInfo(fileName);
Response.ContentType = Utility.ReturnExtension(file.Extension.ToLower());
Response.BinaryWrite(MyFile);
Response.Flush();
Response.Close();
Response.End();
我已经通过编写文件确保我从webservice获得的byte []是可以的
在我的机器上使用以下代码:
StreamWriter writer = null;
string blah = System.Text.ASCIIEncoding.ASCII.GetString(MyFile);
writer = File.CreateText(Server.MapPath(filePath+fileName));
writer.Write(blah);
writer.Close();
writer.Dispose();
如果我删除了Close()和End(),那么整个文件将使用页面中的一些HTML代码进行渲染。 如果我首先在本地计算机上创建/写入文件然后执行Response.TransmitFile(file),我会得到完整的文件(只有XML格式)。
我不确定我做错了什么。也许它只是非常简单。任何帮助将不胜感激
答案 0 :(得分:8)
如果我在Response.Close()
之后调用Response.Flush()
,我遇到了在响应中截断CSV文件的问题。
我的解决方案是替换它:
try
{
response.BinaryWrite(contentBuffer);
}
finally
{
response.Flush();
response.Close();
}
有了这个:
try
{
response.BinaryWrite(contentBuffer);
}
finally
{
response.End();
}
Response.End()
会将所有缓冲的内容刷新到客户端。尝试从响应处理程序中删除Response.Close()
。
答案 1 :(得分:1)
尝试删除
Response.AddHeader("Content-Length", MyFile.Length.ToString());
当你这样做时,看看你是否得到了完整的文件。如果你这样做,那么你的文件长度会很短。
答案 2 :(得分:0)
您可能正在填写响应缓冲区。尝试发送无缓冲,或者如果不起作用,则将文件分散到几个binarywrite调用上,并在每次调用后刷新缓冲区。