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

Foi útil?

Solução

Primeiro, não ligue HttpContext.Current.ApplicationInstance.CompleteRequest();

Referência.

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;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top