Deux choses. Premièrement, si vous conservez la conception du code que vous avez, vous devez effectuer un Seek() sur le MemoryStream avant de l'écrire dans l'entrée.
dt.TableName = "Declaration";
MemoryStream stream = new MemoryStream();
dt.WriteXml(stream);
stream.Seek(0,SeekOrigin.Begin); // <-- must do this after writing the stream!
using (ZipFile zipFile = new ZipFile())
{
zipFile.AddEntry("Report.xml", "", stream);
Response.ClearContent();
Response.ClearHeaders();
Response.AppendHeader("content-disposition", "attachment; filename=Report.zip");
zipFile.Save(Response.OutputStream);
}
Même si vous conservez cette conception, je suggérerais l'utilisation d'une clause using(), comme je l'ai montré, et comme décrit dans tous les documents de la série Exemples de DotNetZip au lieu d'appeler Dispose(). La clause using() est plus fiable face aux échecs.
Maintenant, vous vous demandez peut-être pourquoi il est nécessaire de chercher dans le MemoryStream avant d'appeler AddEntry() ? La raison est que AddEntry() est conçu pour aider les appelants qui passent un flux où la position est importante. Dans ce cas, l'appelant a besoin que les données d'entrée soient lues à partir du flux, en utilisant la position actuelle du flux . AddEntry() supporte cela. Par conséquent, définissez la position dans le flux avant d'appeler AddEntry().
Mais, la meilleure option est de modifier votre code afin d'utiliser la fonction surcharge de AddEntry() qui accepte un WriteDelegate . Il a été conçu spécifiquement pour ajouter des ensembles de données dans des fichiers zip. Votre code original écrit le jeu de données dans un flux de mémoire, puis cherche sur le flux et écrit le contenu du flux dans le zip. C'est plus rapide et plus facile si vous écrivez les données une seule fois, ce que le WriteDelegate vous permet de faire. Le code ressemble à ceci :
dt.TableName = "Declaration";
Response.ClearContent();
Response.ClearHeaders();
Response.ContentType = "application/zip";
Response.AppendHeader("content-disposition", "attachment; filename=Report.zip");
using(Ionic.Zip.ZipFile zipFile = new Ionic.Zip.ZipFile())
{
zipFile.AddEntry("Report.xml", (name,stream) => dt.WriteXml(stream) );
zipFile.Save(Response.OutputStream);
}
Ceci écrit le jeu de données directement dans le flux compressé du fichier zip. Très efficace ! Pas de double tampon. Le délégué anonyme est appelé au moment de ZipFile.Save(). Une seule écriture (+compression) est effectuée.
3 votes
Alors, quelle partie ne fonctionne pas ? :)
0 votes
Le fichier xml dans le fichier zip est vide.