如何在ASP.NET MVC3中使用HttpFileCollectionBase实现多个文件选择和上传?

时间:2013-03-18 06:57:31

标签: c# asp.net-mvc-3

我使用PLUpload框架实现了多个文件选择。

可以将控制器中的Request.Files传递给模型(会处理文件)吗?

我知道Request.Files会自动从页面中获取所有input type='file'标记。

需要采取哪些解决方法?

我不想在提交表单之前上传文件。我想在提交表单时,上传将继续进行。

示例:选择两个文件后,我在HTML代码中有以下标记:

<div id="filelist">
  <div id="p17lu3r33g14jk1dg31u0dg1l1lll3">test.xml (272 KB) <b></b></div>
  <div id="p17lu3r33h9mt2oiel81l5t17iq4">abcde.xml (272 KB) <b></b></div>
</div>

上传者的HTML代码形式:

<div id="upload-container">
   <div>
      <a id="pickfiles" href="#">Select files</a>      
      <a id="uploadfiles" href="#">Upload selected files</a>
   </div>
   <div>
      <div id="filelist">
      </div>
   </div>
</div>

1 个答案:

答案 0 :(得分:4)

假设文件输入的名称例如是files,您可以执行以下控制器操作:

[HttpPost]
public ActionResult Upload(IEnumerable<HttpPostedFileBase> files)
{
    ....
}

或定义视图模型:

public class MyViewModel
{
    public IEnumerable<HttpPostedFileBase> Files { get; set; }
}

然后:

[HttpPost]
public ActionResult Upload(MyViewModel model)
{
    ....
}

重要的是让文件输入命名相同。例如:

<input type="file" name="files" />
<input type="file" name="files" />
<input type="file" name="files" />
...

更新:

您似乎想要使用PLUpload插件。此插件单独发送每个文件并使用块。所以这是一个如何处理服务器上传的例子:

[HttpPost]
public ActionResult Upload(int? chunk, string name)
{
    var fileUpload = Request.Files[0];
    var uploadPath = Server.MapPath("~/App_Data");
    chunk = chunk ?? 0;
    using (var fs = new FileStream(Path.Combine(uploadPath, name), chunk == 0 ? FileMode.Create : FileMode.Append))
    {
        var buffer = new byte[fileUpload.InputStream.Length];
        fileUpload.InputStream.Read(buffer, 0, buffer.Length);
        fs.Write(buffer, 0, buffer.Length);
    }
    return Json(new { message = "chunk uploaded", name = name });
}