Wie kann ich einen Web-API-Controller erstellen, der eine komprimierte Zip-Datei generiert und zurückgibt, die aus einer Sammlung von speicherinternen JPEG-Dateien (MemoryStream-Objekten) gestreamt wurde. Ich versuche die DotNetZip-Bibliothek zu verwenden. Ich habe dieses Beispiel gefunden: http://www.4guysfromrolla.com/articles/092910-1.aspx#postadlink. Aber die Response.OutputStream ist nicht verfügbar in Web-API und so Technik funktioniert nicht ganz. Daher habe ich versucht, die Zip-Datei in einem neuen MemoryStream zu speichern; aber es hat geworfen. Zuletzt habe ich versucht, PushStreamContent zu verwenden. Hier ist mein Code:Wie kann ein Controller mithilfe der ASP.NET-Web-API eine Sammlung gestreamter Bilder zurückgeben, die mit der DotNetZip-Bibliothek komprimiert wurden?
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.Save (memStream) wirft NULL-Verweis. Aber weder zipFile noch memStream sind null und es gibt keine interne Ausnahme. Ich bin mir also nicht sicher, was die Nullreferenz verursacht. Ich habe sehr wenig Erfahrung mit Web-API, Speicher-Streams, und ich habe noch nie zuvor DotNetZipLibrary verwendet. Dies ist ein Follow-up zu dieser Frage: Want an efficient ASP.NET Web API controller that can reliably return 30 to 50 ~3MB JPEGs
Irgendwelche Ideen? Vielen Dank!
ich nichts falsch mit Ihrem WebAPI Code. Allerdings würde ich StreamContent anstelle von ByteArrayContent verwenden. Ich weiß, du hast gesagt, du bekommst den NULL-Verweis bei der zipFile.Save, aber ich würde versuchen, die using() um das neue ZipFile() zu entfernen. –
Danke. Leider half das Entfernen der Verwendung nicht. Es wirft immer noch NullReferenceException bei zipFile.Save (...). Hier ist die Spur: bei Ionic.Zlib.ParallelDeflateOutputStream._Flush (Boolean lastInput) bei Ionic.Zlib.ParallelDeflateOutputStream.Close() bei Ionic.Zip.ZipEntry.FinishOutputStream (Stream s, CountingStream entryCounter, Stream Verschlüssler, Stream Kompressor, CrcCalculatorStream Ausgabe) bei Ionic.Zip.ZipEntry._WriteEntryData (Stream s) bei Ionic.Zip.ZipEntry.Write (Stream s) bei Ionic.Zip.ZipFile.Save() bei Ionic.Zip.ZipFile.Save (Stream output) – CalvinDale
Nach bitmap.Save tun, was ist die Position von memoryStream? Möglicherweise müssen Sie memoryStream.Position = 0 setzen, sonst könnten Sie null Bytes in die Zip-Datei speichern. –