Como lidar com erros ao usar asp.net para criar um zipfile para download?
-
27-09-2019 - |
Pergunta
Estou trabalhando em uma funcionalidade no meu site ASP.NET que permite ao usuário baixar alguns arquivos como um arquivo zip. Estou usando a biblioteca dotnetzip para gerar o arquivo zip.
Meu código se parece com o seguinte:
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");
}
Agora, se algo der errado, digamos o método UTILS.ExportTozip falhar, quero apresentar uma mensagem de erro ao usuário e não à caixa de diálogo Download. Devo remover alguns dados do objeto de resposta para cancelar a operação de download?
Atenciosamente
OKB
Solução
Primeiro, não ligue HttpContext.Current.ApplicationInstance.CompleteRequest();
A certa altura, havia algum código de exemplo que mostrou o completErequest (), mas está errado.
Segundo - para fazer o que você descreve, você precisará garantir que o arquivo ZIP possa ser criado corretamente e na íntegra, antes de enviar qualquer coisa. Isso significa que você deve fazer o AddResponseDataForZipFile()
Somente após o zipfile ser completamente criado. Isso significa que você precisa criar um arquivo zip real no servidor, e não simplesmente salvar para Response.OutputStream
. Depois que o arquivo é criado com sucesso, ligue AddResponseDataForZipFile()
, transmita os bytes para o arquivo ZIP temp, ligue Response.Close()
, exclua o arquivo zip temporário.
Outras dicas
Não posso comentar no momento, então tome essa resposta como uma.
Como funciona utils.exportTozip? Se o motivo pelo qual for necessário a resposta.
Response.BufferOutput = true;