我有一个控制器操作,该操作创建一个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帖子将其拼凑在一起。
答案 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);
}
}