我使用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>
答案 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 });
}