À l'aide de l'API Web ASP.NET, comment un contrôleur peut-il renvoyer une collection d'images en streaming compressées à l'aide de DotNetZip Library?
Comment puis-je créer un site Web API contrôleur génère et renvoie un fichier compressé zip diffusés à partir d'une collecte de la mémoire de fichiers JPEG (MemoryStream objets). Je suis d'essayer d'utiliser DotNetZip de la Bibliothèque. J'ai trouvé cet exemple: http://www.4guysfromrolla.com/articles/092910-1.aspx#postadlink. Mais la Réponse.OutputStream n'est pas disponible dans l'API Web et donc que la technique ne fonctionne pas. Donc j'ai essayé d'enregistrer le fichier zip dans un nouveau MemoryStream; mais il l'a jeté. Enfin, j'ai essayé d'utiliser PushStreamContent. Voici mon code:
public HttpResponseMessage Get(string imageIDsList) {
var imageIDs = imageIDsList.Split(',').Select(_ => int.Parse(_));
var any = _dataContext.DeepZoomImages.Select(_ => _.ImageID).Where(_ => imageIDs.Contains(_)).Any();
if (!any) {
throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.NotFound));
}
var dzImages = _dataContext.DeepZoomImages.Where(_ => imageIDs.Contains(_.ImageID));
using (var zipFile = new ZipFile()) {
foreach (var dzImage in dzImages) {
var bitmap = GetFullSizeBitmap(dzImage);
var memoryStream = new MemoryStream();
bitmap.Save(memoryStream, ImageFormat.Jpeg);
var fileName = string.Format("{0}.jpg", dzImage.ImageName);
zipFile.AddEntry(fileName, memoryStream);
}
var response = new HttpResponseMessage(HttpStatusCode.OK);
var memStream = new MemoryStream();
zipFile.Save(memStream); //Null Reference Exception
response.Content = new ByteArrayContent(memStream.ToArray());
response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/zip");
response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { FileName = string.Format("{0}_images.zip", dzImages.Count()) };
return response;
}
}
zipFile.Enregistrer(memStream) renvoie null référence. Mais ni zipFile ni memStream sont nuls et il n'y a pas d'exception interne. Donc, je ne suis pas sûr de ce qui cause la référence null. J'ai très peu d'expérience avec les API Web, la mémoire des ruisseaux, et je n'ai jamais utilisé DotNetZipLibrary avant. C'est un suivi à cette question: Voulez efficace ASP.NET Web API contrôleur fiable de retour de 30 à 50 ~3 MO Jpeg
Des idées? merci!
source d'informationauteur CalvinDale
Vous devez vous connecter pour publier un commentaire.
Une approche plus générique pourrait fonctionner comme ceci:
La
ZipContentResult
méthode pourrait aussi vivre dans une classe de base et être utilisée à partir de tout autre action, de tout api contrôleur.La PushStreamContent classe peut être utilisée dans ce cas d'éliminer la nécessité pour les MemoryStream, au moins pour l'ensemble du fichier zip. Il peut être mis en œuvre comme ceci:
Idéalement, il serait possible de rendre cette situation encore plus créé de façon dynamique à l'aide de la ZipOutputStream de classe, de créer dynamiquement le zip au lieu d'utiliser ZipFile. Dans ce cas, la MemoryStream pour chaque bitmap ne seraient pas nécessaires.
Utilisés Cadre .NET 4.6.1 avec MVC 5
J'ai juste eu le même problème que vous.
Le problème était que j'étais à l'ajout de fichiers à partir d'un flux de mémoire comme suit:
Tout ce que vous avez à faire est de changer à cela:
Il semble que, lorsque l'auteur décide d'écrire le fichier et essaie de lire le flux, le flux de déchets collectés ou qqch...
Cheers!