Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用一个actionlink在mvc4中下载多个文件?_C#_Asp.net Mvc_Asp.net Mvc 4 - Fatal编程技术网

C# 如何使用一个actionlink在mvc4中下载多个文件?

C# 如何使用一个actionlink在mvc4中下载多个文件?,c#,asp.net-mvc,asp.net-mvc-4,C#,Asp.net Mvc,Asp.net Mvc 4,行动: BinaryContentResult方法: public ActionResult Download(string filename) { var filenames = filename.Split(',').Distinct(); var dirSeparator = Path.DirectorySeparatorChar; foreach (var f in filenames) {

行动:

BinaryContentResult方法:

public ActionResult Download(string filename)
    {
        var filenames = filename.Split(',').Distinct();
        var dirSeparator = Path.DirectorySeparatorChar;
        foreach (var f in filenames)
        {
            if (String.IsNullOrWhiteSpace(f)) continue;
            var path = AppDomain.CurrentDomain.BaseDirectory + "Uploads" + dirSeparator + f;
            if (!System.IO.File.Exists(path)) continue;
            return new BinaryContentResult
                       {
                           FileName = f,
                           ContentType = "application/octet-stream",
                           Content = System.IO.File.ReadAllBytes(path)
                       };
        }
        return View("Index");
    }
视图:


但是actionlink只需下载一个(First)文件。

一种可能性是将所有文件压缩到一个文件中,然后将此压缩文件返回给客户端。此外,您的代码还有一个巨大的缺陷:在将整个文件内容返回到客户端之前,您正在将其加载到内存中:
System.IO.file.ReadAllBytes(path)
,而不是仅使用专门为此目的设计的
FileStreamResult
。您似乎用
BinaryContentResult
类重新发明了一些轮子

因此:

公共操作结果下载(字符串文件名)
{
var filenames=filename.Split(',').Distinct();
字符串zipFile=Zip(文件名);
返回文件(zip,“应用程序/八位字节流”,“download.zip”);
}
私有字符串Zip(IEnumerable文件名)
{
//在这里,您可以使用任何可用的zip库,例如SharpZipLib
//创建包含所有文件的zip文件并返回物理
//此zip文件在磁盘上的位置
}

为什么要发明一个较慢版本的
FileStreamResult
?HTTP不支持这一点。如何使用
FileStreamResult
public class BinaryContentResult : ActionResult
{
    public string ContentType { get; set; }
    public string FileName { get; set; }
    public byte[] Content { get; set; }
    public override void ExecuteResult(ControllerContext context)
    {
        context.HttpContext.Response.ClearContent();
        context.HttpContext.Response.ContentType = ContentType;
        context.HttpContext.Response.AddHeader("content-disposition", "attachment; filename=" + FileName);
        context.HttpContext.Response.BinaryWrite(Content);
        context.HttpContext.Response.End();
    }
}
 @{
                foreach (var item in Model)
                {
                @Html.ActionLink("Link","Index", "FileUpload", new { postid = item.PostId })
                }
            }
public ActionResult Download(string filename)
{
    var filenames = filename.Split(',').Distinct();
    string zipFile = Zip(filenames);
    return File(zip, "application/octet-stream", "download.zip");
}

private string Zip(IEnumerable<string> filenames)
{
    // here you could use any available zip library, such as SharpZipLib
    // to create a zip file containing all the files and return the physical
    // location of this zip on the disk
}