返回多个文件的C# MVC ActionResult

5

一个MVC的ActionResult可以返回多个文件吗?如果可以,它可以返回多种类型的多个文件吗?

例如:
一个ActionResult可以返回myXMLfile1.xml、myXMLfile2.xml和myfile3.xml吗?

一个ActionResult可以返回myXMLfile4.xml和myTXTfile1.txt吗?

如何实现这一点?


实现这个的一种方法是创建一个包含你想要返回的所有文件的 zip 文件,然后将其作为单个文件返回。 - yoozer8
1个回答

5

您不能返回多个文件,但是可以将多个文件压缩成一个 .zip 文件并返回这个压缩文件。例如,可以在项目中创建一个自定义的 ActionResult,像这样:

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

} 

然后像这样使用它:

public ActionResult Download()
{
    var zipResult = new ZipResult(
        Server.MapPath("~/Files/file1.xml"),
        Server.MapPath("~/Files/file2.xml"),
        Server.MapPath("~/Files/file3.xml")
    );
    zipResult.FileName = "result.zip";

    return zipResult;
}

点击这里查看更多相关资讯,该文章关于ASP.NET MVC动态创建ZIP文件并返回的问题。


谢谢Felipe!ZipResult和gzip文件是一样的吗? - A Bogus
正如我上面发布的代码所示,“ZipResult”类使用“SharpZipLib”库来压缩文件,您可以在NuGet上找到它并将其添加到您的应用程序中。您也可以更改文件压缩方式,但主要思想是相同的:)。 - Felipe Oriani

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接