2013-03-11 75 views
0

行动:如何使用一个actionlink下载mvc4中的多个文件?

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

BinaryContentResult方法:

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

但ActionLink的只是下载一个(最前一页)文件。

+1

你为什么要重新发明'FileStreamResult'较慢的版本? – SLaks 2013-03-11 13:45:42

+0

HTTP不支持。 – SLaks 2013-03-11 13:46:08

+0

如何使用'FileStreamResult'? – 2013-03-11 13:49:23

回答

1

一种可能性是将所有文件压缩成单个文件,然后将此zip返回给客户端。此外,您的代码还有一个巨大的缺陷:在将其返回给客户端之前,您正在将全部文件内容加载到内存中:System.IO.File.ReadAllBytes(path)而不是仅使用专为此目的而设计的FileStreamResult。你似乎已经用BinaryContentResult这个班改造了一些车轮。

所以:

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 
} 
+0

你能帮我解决这个问题吗? – 2013-03-12 08:27:49