Я использую любимую библиотеку архивации DotNetZip в MVC3 для создания Zip-файла на лету, который содержит изображения .png из двоичных файлов, хранящихся в базе данных. Затем я передаю сгенерированный Zip-файл для загрузки пользователем. (Я проверяю данные изображения перед сохранением в базу данных, поэтому вы можете предположить, что все данные изображения действительны).
public ActionResult PictureExport()
{
IEnumerable<UserPicture> userPictures = db.UserPicture.ToList();
//"db" is a DataContext and UserPicture is the model used for uploaded pictures.
DateTime today = DateTime.Now;
string fileName = "attachment;filename=AllUploadedPicturesAsOf:" + today.ToString() + ".zip";
this.Response.Clear();
this.Response.ContentType = "application/zip";
this.Response.AddHeader("Content-Disposition", fileName);
using (ZipFile zipFile = new ZipFile())
{
using (MemoryStream stream = new MemoryStream())
{
foreach (UserPicture userPicture in userPictures)
{
stream.Seek(0, SeekOrigin.Begin);
string pictureName = userPicture.Name+ ".png";
using (MemoryStream tempstream = new MemoryStream())
{
Image userImage = //method that returns Drawing.Image from byte[];
userImage.Save(tempstream, ImageFormat.Png);
tempstream.Seek(0, SeekOrigin.Begin);
stream.Seek(0, SeekOrigin.Begin);
tempstream.WriteTo(stream);
}
zipFile.AddEntry(pictureName, stream);
}
zipFile.Save(Response.OutputStream);
}
}
this.Response.End();
return RedirectToAction("Home");
}
Этот код будет работать для загрузки и экспорта ОДНОГО (1) изображения. Однако после загрузки в базу данных более одного изображения и последующей попытки экспортировать их все сгенерированный Zip-файл будет содержать только данные самого последнего загруженного изображения. Все остальные ИМЕНА изображений появятся в zip-файле, но их размер файла будет равен 0, и они будут просто пустыми файлами.
Я предполагаю, что моя проблема связана с MemoryStreams (или с тем, что я упускаю что-то простое), но, насколько я могу судить по коду, изображения извлекаются из базы данных и добавляются в zip успешно...