将动态FileName添加到DotNetZip MVC扩展方法

时间:2014-12-19 08:05:01

标签: c# asp.net-mvc razor streaming dotnetzip

我正在使用DotNetZip MVC扩展方法示例添加多个文件(我从存储库中获取)但我似乎无法弄清楚如何将自己的fileName传递给扩展方法并获得其他结果比“file.zip”,这是他们的例子硬编码默认值。下面是我的CSHTML代码,我的动作和我的扩展方法。您将在我的Action中看到我有一个我想要使用的文件名。

我很尴尬地展示我的尝试,但你可以看到我想用于我的文件名。有什么建议吗?

CSHTML(Razor)

<a href="/Renders/Download/@renders.RenderId">Download</a>

控制器操作:

    public ActionResult Download(int id)
    {
        var allImages = _repo.GetImagesByRender(id);
        var list = new List<String>();

        var render = _repo.GetRenderById(id);
        var fileName = render.Select(r => r.Title);

        foreach (var img in allImages)
        {
            list.Add(Server.MapPath("~/ImageStore/" + img.Path));
        }

        return new ZipResult(list);
    }

扩展方法

public class ZipResult : ActionResult
{
    private IEnumerable<string> _files;
    private string _fileName;

    public string FileName
    {
        get
        {
            return _fileName ?? "file.zip";
        }
        set { _fileName = value; }
    }

    public ZipResult(params string[] files)
    {
        this._files = files;
    }

    public ZipResult(IEnumerable<string> files)
    {
        this._files = files;
    }

    public override void ExecuteResult(ControllerContext context)
    {   // using clause guarantees that the Dispose() method is called implicitly!
        using (ZipFile zf = new ZipFile())
        {
            zf.AddFiles(_files, false, "");
            context.HttpContext.Response
                   .ContentType = "application/zip";
            context.HttpContext.Response
                   .AppendHeader("content-disposition", "attachment; filename=" + FileName);

            zf.Save(context.HttpContext.Response.OutputStream);
        }
    }

} 

对于Repo,它返回由RenderId和propper Render关联的正确Images集合,以便我可以使用Render Title作为fileName,但是如何修改ACtion和Extended Action Method以便制作我的zipFile有正确的名字吗?

1 个答案:

答案 0 :(得分:2)

您可以在ZipResult类中添加另一个构造函数:

...
public ZipResult(IEnumerable<string> files, string fileName)
{
    this._files = files;
    this._fileName = fileName;
}
...

然后在控制器中你可以使用它:

...
return new ZipResult(list, "test.zip");