我正在我的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
答案 0 :(得分:1)
此刻我无法发表评论,所以请将此答案作为一个答案。
Utils.ExportToZip如何运作? 如果构造函数采用Response.OutputStream的原因是将zip文件直接写入其中,那么您需要设置Buffering以便在AddResponseDataForZipFile方法中“撤消”:
Response.BufferOutput = true;
答案 1 :(得分:1)
首先,请勿致电HttpContext.Current.ApplicationInstance.CompleteRequest();
有一次,有一些示例代码显示了CompleteRequest(),但这是错误的。
第二 - 做你所描述的,
在发送任何内容之前,您需要确保可以正确地创建zip文件。这意味着只有在完全创建zipfile后才能执行AddResponseDataForZipFile()
。这意味着您需要在服务器上创建一个实际的zip文件,而不是简单地保存到Response.OutputStream
。成功创建文件后,调用AddResponseDataForZipFile()
,流式传输临时zip文件的字节,调用Response.Close()
,然后删除临时zip文件。