我有一个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();
}
我应该用什么模式来实现这个目标?
答案 0 :(得分:1)
您可以压缩所有选定的文件并将其发送出去。在名为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");