Объекты потока памяти не сохраняются в DotNetZip

Я пытаюсь создать почтовый файл 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-файл. Мне нужно знать, почему эти потоки не добавляются. Бесконечно благодарен!

1 ответ

Ок... нашел ответ сам....

Так что, как оказалось, не только

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

незадолго до вызова вернуть файл все работало нормально.

Другие вопросы по тегам