Возврат потокового файла из zip-файла
Привет,
У меня есть куча изображений, хранящихся в zip-файлах. Я пытаюсь вернуть изображение из моего приложения Web Api 2. Может ли кто-нибудь предложить умный способ вернуть поток непосредственно из zip-архива, а затем избавиться от него (код ниже)?
Я подумываю о том, чтобы отказаться от плана " zip " и сохранить изображения в виде плоских файлов, но их буквально миллионы. Я беспокоюсь о том, сколько места они займут на диске.
Я ищу самый быстрый способ доставить изображение с момента запроса. Это моя главная забота об этом PoC.
Спасибо ^_^
Энди
Что я уже пробовал:
В настоящее время я копирую поток в поток памяти:
Я храню путь как "C:\ImageLib\1045.zip\GS67801_POS_Image.jpg"
private Stream GetImageByItemCode(string itemCode) { var item = ItemType.SelectByItemCode(itemCode).FirstOrDefault(); if (item == null) return null; if (item.PosImagePath == null) return null; MemoryStream ms = new MemoryStream(); if (item.PosImagePath.IndexOf(".zip") > 0) { var zipPath = item.PosImagePath.Substring(0, item.PosImagePath.IndexOf(".zip") + 4); var filename = item.PosImagePath.Substring(item.PosImagePath.IndexOf(".zip") + 5); var zipFile = ZipFile.Open(zipPath, ZipArchiveMode.Read); var entry = zipFile.Entries.Where(e => e.FullName == filename).FirstOrDefault(); if (entry == null) return null; entry.Open().CopyTo(ms); ms.Seek(0, SeekOrigin.Begin); } return ms; }
Это PoC, поэтому я не оптимизировал способ хранения имени файла atm. С этой деталью я разберусь позже.
Этот метод используется для создания HttpResponse:
public HttpResponseMessage GetImageImg(string itemCode, int size) { Stream imageStream = GetImageByItemCode(itemCode); //var imageArray = ResizeImage(image, size); var response = Request.CreateResponse(); if (imageStream == null) { return response; } response.Content = new StreamContent(imageStream); response.Content.Headers.ContentType = new MediaTypeHeaderValue("image/jpeg"); return response; }
который возвращается моим контроллером здесь:
[Route("{itemCode}/{size:int?}")] public object GetImage(string itemCode, int size = 1) { var query = Request.GetQueryNameValuePairs().ToDictionary(p => p.Key.ToLower(), p => p.Value.ToLower()); var format = "img"; if (query.ContainsKey("format")) { format = query["format"]; } switch (format) { default: return GetImageImg(itemCode, size); } }
Не беспокойтесь обо всей этой ерунде с форматированием. В конце концов размер / формат будут храниться в моей библиотеке как отдельные файлы.