将 zip 文件写入 MemoryStream

Write zip files to MemoryStream

我有一个创建 zip 文件并发送回用户以供下载的控制器操作。问题是 zip 文件已创建,但它是空的。不知何故,它没有将图像文件写入 MemoryStream。我想知道我错过了什么。如果我将 zip 文件写入磁盘,一切都会按预期工作,但如果可以避免,我宁愿不将文件保存到磁盘。这是我使用 dotnetzip 尝试过的:

public ActionResult DownloadGraphs()
    {
        var state = Session["State"];
        using (ZipFile zip = new ZipFile())
        {
            if (state == "IA")
            {
                zip.AddFile(Server.MapPath("~/Content/DataVizByState/FallGraphs/Watermarked/Fall_IA.jpg"), "");
                zip.AddFile(Server.MapPath("~/Content/DataVizByState/SpringGraphs/Watermarked/Spring_IA.jpg"), "");
            }
            MemoryStream output = new MemoryStream();
            zip.Save(output);
            output.Seek(0, SeekOrigin.Begin);
            var fileName = state + "Graphs.zip";
            return File(output, "application/zip", fileName);
        }
    }

这会根据单击按钮在视图中强制下载:

$('#graphDwnldBtn').click(function (evt) {
    window.location = '@Url.Action("DownloadGraphs", "DataSharing")';
})

我需要使用 StreamWriter 还是 Reader 之类的?这是我第一次尝试这样的事情,它是通过阅读各种 Whosebug 帖子拼凑而成的...

愚蠢的错误:Session["State"] 是一个 object,所以 state 变量输出为 object 而不是我需要的 string是为了让我的条件语句正确评估。我将 state 转换为 string 来修复它。固定码:

public ActionResult DownloadGraphs()
    {
        var state = Session["State"].ToString(); 
        using (ZipFile zip = new ZipFile())
        {
            if (state == "IA")
            {
                zip.AddFile(Server.MapPath("~/Content/DataVizByState/FallGraphs/Watermarked/Fall_IA.jpg"), "");
                zip.AddFile(Server.MapPath("~/Content/DataVizByState/SpringGraphs/Watermarked/Spring_IA.jpg"), "");
            }
            MemoryStream output = new MemoryStream();
            zip.Save(output);
            output.Seek(0, SeekOrigin.Begin);
            var fileName = state + "Graphs.zip";
            return File(output, "application/zip", fileName);
        }
    }