MVC3 で最愛の DotNetZip アーカイブ ライブラリを使用して、データベースに格納されたバイナリからの .png 画像を含む Zip ファイルをオンザフライで生成しています。次に、生成された 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 ファイルが正常に...