Créer fichier zip à partir de byte[]
Je suis en train de créer un fichier Zip dans .NET 4.5 (Système d'.IO.La Compression) à partir d'une série de tableaux d'octets. Par exemple, à partir d'une API, je suis à l'aide, je me retrouve avec un List<Attachment>
et chaque Attachment
a une propriété appelée Body
qui est un byte[]
. Comment puis-je effectuer une itération sur cette liste, et de créer un fichier zip qui contient chaque pièce jointe?
Maintenant je suis sous l'impression que j'aurais à écrire chaque pièce jointe sur le disque et créer le fichier zip à partir de cela.
//This is great if I had the files on disk
ZipFile.CreateFromDirectory(startPath, zipPath);
//How can I create it from a series of byte arrays?
- Avez-vous regardé le reste de la classe en Système.IO.La Compression, en particulier ceux qui ont de Flux en leur nom?
- dotnetperls.com/gzipstream softdeveloping.blogspot.dans/2012/01/...
- J'ai peut-être raté quelque chose, mais, je ne pense pas que je peux avoir un GZipStream avec plusieurs fichiers en sortie.
Vous devez vous connecter pour publier un commentaire.
Après un peu plus de jeu autour et de la lecture, j'ai été capable de comprendre cela. Voici comment vous pouvez créer un fichier zip (archive) avec plusieurs fichiers sans avoir à écrire de données temporaires sur le disque:
Close()
au lieu de imbriquéeusing
s?Close()
sur?References
->Add Reference
. En vertu deAssemblies
, recherche pourSystem.IO
et cochezSystem.IO.Compression.FileSystem
etSystem.IO.Compression
.using
consolidés. Si vous avez plusieursusing
s dans une ligne sans code entre les deux, vous n'avez pas à les imbriquer.compressedFileStream
est passé dans le constructeur de laZipArchive
objet et utilisés en interne.caseAttachmentModel.Body
est le byte[]. Lisez la question 😉C'est une variante de la grande accepté de répondre posté par les OP. Cependant, ceci est pour WebForms au lieu de la MVC. Je travaille avec l'hypothèse que caseAttachmentModel.Le corps est un byte[]
Essentiellement, tout ce qui est la même, sauf avec une méthode supplémentaire qui envoie le zip comme une Réponse.
Je tiens également à souligner que les conseils donnés par @Levi Fuller sur les références à l'acceptés réponse est sur place!
GZipStream et DeflateStream semblent comme ils vous permettent d'utiliser les vapeurs/tableaux d'octets pour résoudre votre problème, mais peut-être pas avec une compression de fichier format utilisable par la plupart des utilisateurs. (c'est à dire, votre fichier devrait avoir un .gz extension) Si ce fichier est utilisé uniquement en interne, qui pourrait être acceptable.
Je ne sais pas comment vous pourriez faire un ZIP à l'aide de Microsoft bibliothèques, mais je me souviens de cette bibliothèque soutenir le genre de choses que vous pourriez trouver utiles:
http://sevenzipsharp.codeplex.com/
Il est sous licence LGPL.