【问题标题】:ASP.NET programmatic file downloadASP.NET 程序文件下载
【发布时间】:2010-02-01 16:52:19
【问题描述】:

所以我有一个页面,我在该页面上动态生成一个表和链接按钮,所有这些按钮都在一个大的 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 或任何事情。此方法是唯一涉及响应的方法。还有其他方法我应该这样做吗?

【问题讨论】:

    标签: c# asp.net download


    【解决方案1】:

    你有UpdatePanel 或类似的吗?

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

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

    【讨论】:

      【解决方案2】:

      如果这不起作用,您应该在 Response.End 之前尝试 Response.Flush,然后您可以在 http://dotnetperls.com/response-binarywrite-aspnet 获得示例代码

      【讨论】:

      • 我尝试添加 Response.Flush 并没有帮助。我看不出我的代码和示例之间的区别,除了我使用的是 Response.BinaryWrite 并且他们使用的是 Response.FileWrite 但我在文件系统上没有文件,因此 FileWrite 将无法工作。
      【解决方案3】:

      Look here

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

      【讨论】:

      • 在这种特定情况下,内容类型不正确 application/pdf
      • 你正在用 Javascript 对下载的文件做些什么?
      【解决方案4】:

      在其他一切清理之前调用Response.Clear(); 吗?否则,here's a blog post 会进行其他一些故障排除。

      【讨论】:

        【解决方案5】:

        我认为问题是由同时设置 Response.Buffer 和 Response.BufferOutput 引起的。单独的 BufferOutput 可能就是您想要的。

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

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-06-24
            • 2011-02-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多