ASP.NET程序化文件下载

时间:2010-02-01 16:52:20

标签: c# asp.net download

所以我有一个页面,我在其中动态生成一个大型UpdatePanel内的表和链接按钮。单击时,每个链接按钮都将调用此方法。目标是让链接指向我的数据库中的文件,并在单击时允许用户打开/另存为该文件。这个确切的方法在我的网站的另一个页面上工作正常,通常具有相同的设置,但在这个我得到的:

Microsoft JScript运行时错误:Sys.WebForms.PageRequestManagerParserErrorException:无法解析从服务器收到的消息。此错误的常见原因是通过调用Response.Write(),响应过滤器,HttpModules或服务器跟踪来修改响应。 详细信息:在'%PDF-1.3附近解析时出错 % 1 0 ob'。

public void downloadFile(int fileID)
    {
        using (SurveyDataContext context = new SurveyDataContext())
        {
            try
            {
                var file = context.tblFiles.Single(f => f.FileID == fileID);
                Response.Clear();
                Response.Buffer = true;
                Response.BufferOutput = true;
                Response.ContentType = file.MIMEtype;
                Response.AppendHeader("Content-Disposition", "attachment; filename=\"" + file.FileName.Trim() + "\"");
                Response.AddHeader("Extension", file.FileName.Substring(
                    file.FileName.LastIndexOf('.') + 1).ToLower());
                Response.BinaryWrite(file.FileData.ToArray());

                Response.Flush();
                Response.End();
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                Console.WriteLine(e.InnerException);
            }
        }
    }

我做错了什么?我没有做任何Response.Writes或任何事情。这种方法是唯一触及Response的方法。还有其他方法我应该这样做吗?

6 个答案:

答案 0 :(得分:0)

您应该在Response.End之前尝试Response.Flush,如果这不起作用,那么您在http://dotnetperls.com/response-binarywrite-aspnet

处有示例代码

答案 1 :(得分:0)

Look here

您可能设置了错误的内容类型

答案 2 :(得分:0)

在其他所有内容之前调用Response.Clear();是否会清除它?否则,here's a blog post会进行其他一些故障排除。

答案 3 :(得分:0)

我认为问题是由设置Response.Buffer和Response.BufferOutput引起的。 BufferOutput可能就是你想要的。

如果删除Response.Buffer不起作用,我会尝试通过设置ContentType =“application / octet-stream”并注释掉“Extension”标题来简化一点。仅对文件名的扩展名就足够了。

答案 4 :(得分:0)

我意识到我做错了什么...... 我需要让每个链接按钮都有一个PostBackTrigger。一旦我这样做,一切都按照原来的方式进行。

答案 5 :(得分:0)

你有UpdatePanel或类似的东西吗?

如果是你的情况,那么你可以在页面加载时执行此操作:

ScriptManager _scriptManager = ScriptManager.GetCurrent(this.Page);
_scriptManager.RegisterPostBackControl(Button1);