内存流对象无法保存到DotNetZip

3

我正在尝试创建一个DotNetZip压缩文件,并将其流式传输给用户。在压缩文件中,我插入了两个内存流。但是出现了一个问题,当我打开压缩文件时,它是空的。我查看了文档,没有找到什么有用的信息。以下是我的代码:

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文件。 我需要知道为什么这些流没有被添加。 非常感谢!

1个回答

6

好的...我自己找到了答案...

事实证明,不仅

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);

在返回文件前,一切都运作良好。

1
这个答案非常有帮助,解决了我的问题,非常感谢。请考虑接受这个答案,让其他人知道它是有用的。 - Hakan Fıstık

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接