3

我的问题:当用户单击 aspx 页面上的图像按钮时,代码隐藏会创建一个 zip 文件,然后我尝试将该 zip 文件流式传输给用户。

要流式传输文件,我使用以下代码:

FileInfo toDownload = new FileInfo(fullFileName);
if (toDownload.Exists)
{
   Response.Clear();
   Response.ContentType = "application/zip";
   Response.AppendHeader("Content-Disposition", "attachment;filename=" +
             toDownload.Name);
   Response.AppendHeader("Content-Length", toDownload.Length.ToString());
   Response.TransmitFile(fullFileName);
   HttpContext.Current.ApplicationInstance.CompleteRequest();
}

当我尝试执行此操作时,页面上出现以下错误:

Sys.WebForms.PageRequestManagerParserErrorException:无法解析从服务器接收到的消息。此错误的常见原因是通过调用 Response.Write()、响应过滤器、HttpModules 或启用了服务器跟踪来修改响应。详细信息:在“PK...”附近解析错误。

PK 是 zip 文件中将其标识为 zip 文件的前两个字符,因此我知道它正在尝试将 zip 文件发送到浏览器。但是,我的印象是浏览器正在尝试解释和/或呈现 zip 文件,而我希望它弹出一个下载文件选项。

想法?

编辑:这是写上述错误消息的人的帖子的链接。

4

3 回答 3

2

例如,这是我在我的一个应用程序中向客户端发送 PDF 的方式(您必须填写/更改一些缺少的变量声明):

        byte[] rendered = uxReportViewer.LocalReport.Render("PDF", null, out mimeType, out encoding, out extension, out streamIds, out warnings);

        Response.Buffer = true;
        Response.Clear();
        Response.ClearHeaders();
        Response.ContentType = mimeType;
        Response.CacheControl = "public";
        Response.AddHeader("Pragma", "public");
        Response.AddHeader("Expires", "0");
        Response.AddHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0");
        Response.AddHeader("Content-Description", "Report Export");
        Response.AddHeader("Content-Disposition", "attachment; filename=\"" + filename + "." + extension + "\"");

        Response.BinaryWrite(rendered);
        Response.Flush();
        Response.End();

您将更改内容类型,并将您的 zip 文件转换为字节数组,然后我认为您可以填写其余部分。

于 2009-03-06T17:17:57.900 回答
1

我终于解决了这个问题,还注意到我可能没有在问题中提供足够的信息:图像按钮在 UpdatePanel 中。

解决方案是为控件创建一个 PostBackTrigger:

<Triggers>
    <asp:PostBackTrigger ControlID="ibDownload" />
</Triggers>
于 2009-03-06T17:55:45.830 回答
0

伙计,您不是使用 DotNetZip 生成 zip 文件吗?如果您没有在磁盘上创建 zip 文件,而只是在内存中创建,该怎么办?此示例使用 DotNetZip 来执行此操作。

    Response.Clear();
    Response.BufferOutput = false;
    String ReadmeText= "This is content that will appear in a file " + 
                       "called Readme.txt.\n" + 
                       System.DateTime.Now.ToString("G") ; 
    string archiveName= String.Format("archive-{0}.zip", 
                                      DateTime.Now.ToString("yyyy-MMM-dd-HHmmss")); 
    Response.ContentType = "application/zip";
    Response.AddHeader("content-disposition", "attachment; filename=" + archiveName);

    using (ZipFile zip = new ZipFile())
    {
        // add an entry from a string: 
        zip.AddEntry("Readme.txt", "", ReadmeText);
        zip.AddFiles(filesToInclude, "files");
        zip.Save(Response.OutputStream);
    }
    // Response.End();  // no - see http://stackoverflow.com/questions/1087777
    HttpContext.Current.ApplicationInstance.CompleteRequest();
于 2009-03-06T17:22:20.840 回答