我正在使用iTextSharp创建pdf报告(文件)并将其存储在我的应用程序所在的Web服务器上。我能够创建文件,进入存储文件夹并打开文件没有问题。注意:用户不会自动获取文件 在创作时下载。
我想让用户选择使用按钮从服务器下载“旧”报告。 这在IE(10)中运行良好,但在Chrome和Firefox中没有。我总是收到错误消息: 打开此文档时出错。文件已损坏,无法修复。
我有这个图像按钮,然后单击我根据this post将用户发送到通用处理程序(因为我的页面包含更新面板)(现在只部分使用它)。
这是实际下载文件的代码:
public void ProcessRequest(HttpContext context)
{
var _fileName = context.Request.QueryString["fileName"];
using (var _output = new MemoryStream())
{
//var _fileSeverPath = context.Server.MapPath(_fileName);
context.Response.Clear();
context.Response.ContentType = "application/pdf";// "application/pdf";
//context.Response.AppendHeader("Content-Length", _fileName.Length.ToString());
context.Response.AppendHeader("Content-Disposition", string.Format("attachment; filename=" + Path.GetFileName(_fileName)));
context.Response.WriteFile(_fileName);
context.Response.Flush();
context.Response.Close();
context.Response.End();
}
}
正如我所说,这在IE中运行良好,但在Chrome和Firefox中运行不正常。 当我在记事本中打开文件时,它会在Chrome和Firefox中下载时仅获得大约1/3的文件。
任何建议都将不胜感激。一直试图解决这个问题几天..
答案 0 :(得分:0)
来自HttpResponse.WriteFile Method (String)
当此方法与大文件一起使用时,可能会调用该方法 抛出一个例外。可以与此一起使用的文件的大小 方法取决于Web服务器的硬件配置。对于 更多信息,请参阅文章812406,“PRB:Response.WriteFile不能 在Microsoft知识库网站上下载“大文件”。
请改为尝试:
public void ProcessRequest(HttpContext context)
{
var _fileName = context.Request.QueryString["fileName"];
context.Response.Clear();
context.Response.Buffer = true;
context.Response.ContentType = "application/pdf";
context.Response.AppendHeader(
"Content-Disposition",
string.Format("attachment; filename=" + Path.GetFileName(_fileName)));
using (var fs = new FileStream(_fileName, FileMode.Open, FileAccess.Read))
{
using (var sr = new StreamReader(fs, true))
{
int length = (int)fs.Length;
byte[] buffer;
using (BinaryReader br = new BinaryReader(fs, sr.CurrentEncoding))
{
buffer = br.ReadBytes(length);
context.Response.BinaryWrite(buffer);
}
}
}
context.Response.Flush();
context.Response.Close();
context.Response.End();
}
答案 1 :(得分:0)
好的,最后......我找到了解决方案,这让我觉得自己像个傻瓜一样.. 删除了context.Response.Close(); ......然后一切都很完美:)