如何创建一个 Web API 控制器,该控制器生成并返回从内存中 JPEG 文件(MemoryStream 对象)集合流式传输的压缩 zip 文件。我正在尝试使用 DotNetZip 库。我找到了这个例子:http ://www.4guysfromrolla.com/articles/092910-1.aspx#postadlink 。但是 Response.OutputStream 在 Web API 中不可用,因此该技术不太适用。因此,我尝试将 zip 文件保存到新的 MemoryStream;但它扔了。最后,我尝试使用 PushStreamContent。这是我的代码:
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) 抛出空引用。但是 zipFile 和 memStream 都不是 null 并且没有内部异常。所以我不确定是什么导致了空引用。我对 Web API、内存流的经验很少,而且我以前从未使用过 DotNetZipLibrary。这是对这个问题的跟进:想要一个高效的 ASP.NET Web API 控制器,能够可靠地返回 30 到 50 ~3MB JPEG
有任何想法吗?谢谢!