将zip文件写入MemoryStream

时间:2018-09-26 15:42:40

标签: asp.net-mvc memorystream dotnetzip

我有一个控制器操作,该操作创建一个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或其他工具吗?这是我第一次尝试这样的事情,并且通过阅读各种stackoverflow帖子将其拼凑在一起。

1 个答案:

答案 0 :(得分:0)

愚蠢的错误: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);
        }
    }