如何下载多个文件?获取“发送 HTTP 标头后服务器无法清除标头”

本文关键字:HTTP 发送 服务器 清除 获取 下载 何下载 文件 | 更新日期: 2023-09-27 18:37:03

我有一个MVC应用程序,显示要下载的文件列表。 用户使用复选框选择文件,这些文件使用Pechkin库在服务器端生成为PDF。

我的问题是,在下载多个文件时,我收到"发送HTTP标头后服务器无法清除标头"的错误,我意识到这是因为我只能将单个HTTP响应发送回客户端,但我不确定如何解决这个问题。

    public ActionResult Forms(FormsViewModel model)
    {
        foreach (var item in model.Forms)
        {
            if (item.Selected)
            {
                CreatePdfPechkin(RenderRazorViewToString(model.FormType, model.Form), model.Name);
            }
        }
        return View(model);
    }

    private void CreatePdfPechkin(string html, string filename)
    {
        var pechkin = Factory.Create(new GlobalConfig());
        var pdf = pechkin.Convert(new ObjectConfig()
                                .SetLoadImages(true).SetZoomFactor(1.1)
                                .SetPrintBackground(true)
                                .SetScreenMediaType(true)
                                .SetCreateExternalLinks(true), html);
        Response.Clear();
        Response.ClearContent();
        // error on the next line for the second file to be downloaded
        Response.ClearHeaders();
        Response.ContentType = "application/pdf";
        Response.AddHeader("Content-Disposition", string.Format("attachment;filename={0}.pdf; size={1}", filename, pdf.Length));
        Response.BinaryWrite(pdf);
        Response.Flush();
        Response.End();
    }

我应该使用什么模式来完成此操作?

如何下载多个文件?获取“发送 HTTP 标头后服务器无法清除标头”

您可以压缩所有选定的文件并将其发送。在名为DotNetZip的codeplex上也有可用的库这就是您可以压缩它的方式。

var outputStream = new MemoryStream();
using (var zip = new ZipFile())
{
    zip.AddFile("path to file one");
    zip.AddFile("path to file two");
    zip.AddFile("path to file three");
    zip.AddFile("path to file four");
    zip.Save(outputStream);
}
outputStream.Position = 0;
return File(outputStream, "application/zip","zip file name.zip");