好的,所以我有一个页面,它从web服务中获取文件作为Byte [],然后我给用户保存/取消对话框以保存该文件.该文件可以是xml或cvs格式.下载文件时文件不完整,例如文件应该包含的内容:
美元,欧元,欧元,1.2,1.1,11/15/2009,15:23:27
美元,澳元,澳大利亚,1.25,1.15,11/15/2009,15:23:27
但是当从浏览器中保存时它只有::
USD,EUR,Euro,1.2,1.1,11/15/2009,15:23:27
USD,AUD,Australian,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();
Run Code Online (Sandbox Code Playgroud)
我已经通过以下代码在我的机器上编写文件来确保我从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();
Run Code Online (Sandbox Code Playgroud)
如果我删除Close()和End(),那么整个文件将使用页面中的一些HTML代码呈现.如果我首先在本地计算机上创建/写入文件然后执行Response.TransmitFile(file),我将获得完整文件(仅XML格式).
我不确定我做错了什么.也许它只是非常简单.任何帮助将不胜感激
小智 8
我遇到了一个问题,如果我打电话Response.Close()后,响应中的CSV文件被截断了Response.Flush().
我的解决方案是取代这个:
try
{
response.BinaryWrite(contentBuffer);
}
finally
{
response.Flush();
response.Close();
}
Run Code Online (Sandbox Code Playgroud)
有了这个:
try
{
response.BinaryWrite(contentBuffer);
}
finally
{
response.End();
}
Run Code Online (Sandbox Code Playgroud)
Response.End()将所有缓冲的内容刷新到客户端.尝试Response.Close()从响应处理程序中删除.