内存流对象没有保存到DotNetZip

本文关键字:保存 DotNetZip 对象 内存 | 更新日期: 2023-09-27 18:16:56

我正在尝试创建一个DotNetZip压缩文件,将流式传输给用户。在zip文件中,我插入了两个内存流。但是由于某些原因,当我打开zip文件时,它是空的。我已经把文件看了一遍,没有发现什么有用的东西。我的代码:

public async Task<FileResult> DownloadFile(string fileName){
//Create image memory stream
        System.Drawing.Image image = System.Drawing.Image.FromFile(Server.MapPath("~/Images/" + fileName));
        MemoryStream msImage = new MemoryStream();
        image.Save(msImage, image.RawFormat);
//Create Word document using DocX
        MemoryStream msDoc = new MemoryStream();
        DocX doc = DocX.Create(msDoc);
        Paragraph p1 = doc.InsertParagraph();
        p1.AppendLine("Text information...");
        Paragraph p2 = doc.InsertParagraph();
        p2.AppendLine("DISCLAIMER: ...");
        doc.SaveAs(msDoc);
//Create Zip File and stream it to the user
        MemoryStream msZip = new MemoryStream();
        ZipFile zip = new ZipFile();
        msImage.Seek(0, SeekOrigin.Begin);
        msDoc.Seek(0, SeekOrigin.Begin);
        ZipEntry imageEntry = zip.AddEntry("MyImageName.jpg", msImage);
        ZipEntry docEntry = zip.AddEntry("MyWordDocName.docx", msDoc);
        zip.Save(msZip);
        image.Dispose();
        doc.Dispose();
        zip.Dispose();
        return File(msZip, System.Net.Mime.MediaTypeNames.Application.Octet, "MyZipFileName.zip");
}

我检查了msImage和msDoc的大小,它们都加载了数据,但msZip在大小方面显示得很少。更不用说当它下载时,它是一个空的zip文件。我需要知道为什么这些流没有被添加。万分感谢!

内存流对象没有保存到DotNetZip

Ok…自己找到了答案....

所以事实证明,不仅

ZipEntry imageEntry = zip.AddEntry("MyImageName.jpg", msImage);
ZipEntry docEntry = zip.AddEntry("MyWordDocName.docx", msDoc);

要求msImage和msDoc被设置回0位置,

return File(msZip, System.Net.Mime.MediaTypeNames.Application.Octet, "MyZipFileName.zip");

还要求将msZip设置为0位置。通过添加

msZip.Seek(0, SeekOrigin.Begin);

在调用返回文件之前,一切正常