【问题标题】:How to handle errors when using ASP.NET to create a zipfile for download?使用 ASP.NET 创建 zip 文件以供下载时如何处理错误?
【发布时间】:2010-10-29 10:05:27
【问题描述】:

我正在开发我的 asp.net 网站中的一项功能,该功能使用户能够以 zip 文件的形式下载一些文件。我正在使用 DotNetZip 库来生成 zip 文件。

我的代码如下所示:

protected void OkbtnZipExport_OnClickEvent(object sender, EventArgs e)
{
        var selectedDocumentIds = GetSelectedDocIds();

        string archiveName = String.Format("archive-{0}.zip", DateTime.Now.ToString("yyyy-MMM-dd-HHmmss"));            
        AddResponseDataForZipFile(Response, archiveName);            

        try
        {
            string errorMessage = Utils.ExportToZip(selectedDocumentIds, arkivdelSearchControl.GetbraArkivConnection(), Response.OutputStream);
            if (!string.IsNullOrEmpty(errorMessage))
            {
               LiteralExportStatus.Text = errorMessage;                                                     
            }
            else
                LiteralExportStatus.Text = "Success";

        }
        catch (Exception ex)
        {
            LiteralExportStatus.Text = "Failure " + ex.Message;                
        }

        Response.Flush();
        Response.Close();
        HttpContext.Current.ApplicationInstance.CompleteRequest();
}

private void AddResponseDataForZipFile(HttpResponse response, string zipName)
{
        Response.Clear();
        Response.BufferOutput = false;
        Response.ContentType = "application/x-zip-compressed";
        Response.AddHeader("content-disposition", "attachment; filename=" + zipName);
        Response.AddHeader("Expires", "0");
        Response.AddHeader("Content-Description", "Zip Arcive");
}

现在,如果出现任何问题,比如 Utils.ExportToZip 方法失败,我想向用户显示一条错误消息,而不是下载对话框。我是否必须从 Response 对象中删除一些数据才能取消下载操作?

最好的问候

OKB

【问题讨论】:

    标签: asp.net httpresponse dotnetzip


    【解决方案1】:

    首先,不要打电话给HttpContext.Current.ApplicationInstance.CompleteRequest();

    Reference.

    在某一时刻,有一些示例代码显示 CompleteRequest(),但它是错误的。

    第二 - 做你描述的, 在发送任何内容之前,您需要确保可以正确完整地创建 zip 文件。这意味着您应该仅在完全创建 zip 文件后执行AddResponseDataForZipFile()。这意味着您需要在服务器上创建一个实际的 zip 文件,而不是简单地保存到 Response.OutputStream。成功创建文件后,调用AddResponseDataForZipFile(),流式传输临时压缩文件的字节,调用Response.Close(),然后删除临时压缩文件。

    【讨论】:

      【解决方案2】:

      我暂时无法评论,所以把这个答案当作一个。

      Utils.ExportToZip 是如何工作的? 如果构造函数使用 Response.OutputStream 的原因是将 zip 文件直接写入其中,那么您需要设置 Buffering 以便在您的 AddResponseDataForZipFile 方法中“撤消”它:

      Response.BufferOutput = true;
      

      【讨论】:

      • 我重构了我的代码并设法解决了我的问题。重点是在您尝试创建 zip 文件后创建 httpresponse 数据。因此,如果出现任何问题,则不会操纵响应对象并且不会开始下载过程
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-09
      • 2020-09-06
      相关资源
      最近更新 更多