我的工作在我的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方法失败,我想提出一个错误信息给用户,而不是下载对话框。我一定要去除,以取消下载操作从响应对象的一些数据?

此致

OKB

有帮助吗?

解决方案

第一,不要叫HttpContext.Current.ApplicationInstance.CompleteRequest();

参考。

在一个点上,有一些示例代码,表明CompleteRequest(),但它是错误的。

二 - 做你的描述, 你需要确保zip文件可以正确和整体创建,发送任何数据之前。这意味着你应该做的后,才压缩文件完全创建AddResponseDataForZipFile()。这意味着你需要在服务器上创建一个实际的压缩文件,而不是简单地救出来Response.OutputStream。一旦文件被创建成功,则调用AddResponseDataForZipFile(),流字节的临时zip文件,调用Response.Close(),然后删除临时zip文件。

其他提示

我不能在此刻发表意见,所以采取这个答案之一。

如何Utils.ExportToZip工作? 如果需要的Response.OutputStream为构造函数的原因是直接写的zip文件到它,那么你需要为了设置缓冲到“撤销”,在您的AddResponseDataForZipFile方法:

Response.BufferOutput = true;
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top