“在发送http标头后,服务器无法追加标头”

时间:2013-12-28 07:40:02

标签: asp.net asp.net-3.5

我有像电子邮件消息系统这样的应用程序。在这里我调整一个解决方案,从特定的帖子下载表中的所有文件。  这是我的代码:

    protected void lbu_download_all_Click(object sender, EventArgs e)
    {
        if (rpt_file_list.Items.Count > 0)
        {
            using (DataClassesDataContext db = new DataClassesDataContext())
            {
                var query = from f in db.Files
                            where f.Post_History_id == int.Parse(post_id.Value.ToString())
                            select new
                            {
                                FileName = f.File_name,
                                File_ext= f.File_ext
                            };
                foreach (var item in query)
                {
                    System.IO.FileInfo objFile = new FileInfo(Server.MapPath("~/PostFiles/" + item.FileName.ToString() + item.File_ext.ToString()));
                    if (objFile.Exists)
                    {
                        Response.Clear();
                        string strFileName = item.FileName.ToString() + item.File_ext.ToString();
                        Response.AddHeader("Content-Disposition", "attachment; filename=" + strFileName);
                        Response.AddHeader("Content-Length", objFile.Length.ToString());
                        Response.ContentType = "application/octet-stream";
                        Response.WriteFile(objFile.FullName);
                        Response.BufferOutput = true; 
                        Response.Flush();
                    }
                }
            }
        }
        else
        {
            StringBuilder sb = new StringBuilder();
            sb.Append("<script type = 'text/javascript'>");
            sb.Append(" No files found to download');");
            sb.Append("</script>");
            ClientScript.RegisterStartupScript(this.GetType(), "script", sb.ToString());
        }
    }

我不知道什么是问题,请帮助我..

2 个答案:

答案 0 :(得分:1)

你将无法下载这样的多个文件,我想会发生的事情是循环经过一次,然后在第二次迭代时抛出异常。

你真正应该做的是将所有文件压缩到一个文件中进行下载,这个question应该让你知道我的意思。

通过压缩文件,您还可以获得压缩的好处(更少的带宽,更快的传输),并且用户(在您当前的场景中)将不会显示多个“另存为”对话窗口(更专业! )。

link也可以帮助您了解其他一些潜在的想法(例如,使用带有URL参数的“下载”页面来识别文件)。我更喜欢压缩单文件选项的粉丝!

答案 1 :(得分:0)

您是否正确设置了Response.BufferOutput = true;?如果没有,页面将在生成时发送,这意味着Response.Clear()将不会执行您想要的操作:)