2010-10-29 24 views
0

Je travaille sur une fonctionnalité de mon site Web asp.net qui permet à l'utilisateur de télécharger certains fichiers sous forme de fichier zip. J'utilise la bibliothèque DotNetZip pour générer le fichier zip.Comment gérer les erreurs lors de l'utilisation d'ASP.NET pour créer un fichier zip à télécharger?

Mon code ressemble à ceci:

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"); 
} 

Maintenant, si quelque chose va mal, dire la méthode Utils.ExportToZip échoue, je veux présenter un message d'erreur à l'utilisateur et non la boîte de dialogue de téléchargement. Dois-je supprimer des données de l'objet Response pour annuler l'opération de téléchargement?

Meilleures salutations

OKB

Répondre

1

premier , ne pas appeler HttpContext.Current.ApplicationInstance.CompleteRequest();

Reference.

à un moment donné, il y avait un exemple de code qui a montré CompleteRequest(), mais il est faux. Deuxièmement, pour faire ce que vous décrivez, vous devez vous assurer que le fichier zip peut être créé correctement et dans son intégralité, avant d'envoyer quoi que ce soit. Cela signifie que vous devriez faire le AddResponseDataForZipFile() seulement après que le fichier zip est complètement créé. Cela signifie que vous devez créer un fichier zip réel sur le serveur, et ne pas simplement enregistrer sur Response.OutputStream. Une fois le fichier créé avec succès, appelez AddResponseDataForZipFile(), diffusez les octets pour le fichier zip temporaire, appelez le Response.Close(), puis supprimez le fichier zip temporaire.

+0

Merci! Tu es l'homme cheeso! – OKB

1

Je ne peux pas commenter pour le moment, alors prenez cette réponse comme un.

Comment fonctionne Utils.ExportToZip? Si la raison pour laquelle il prend la Response.OutputStream pour le constructeur est d'écrire le fichier zip directement dans, alors vous devez définir Buffering afin de « défaire » que dans votre AddResponseDataForZipFile Méthode:

Response.BufferOutput = true; 
+0

J'ai refaçonné mon code et réussi à résoudre mon problème. Le but est de créer les données httpresponse après avoir essayé de créer le fichier zip. Donc, si quelque chose se passe mal, l'objet de réponse n'est pas manipulé et le processus de téléchargement n'est pas démarré – OKB