如何从HTML 5多个文件输入元素捕获上载的文件

时间:2012-03-04 02:46:36

标签: asp.net file-upload

如果我有这样的输入元素:

<input type="file" multiple="multiple" name="file1" />

并选择多个文件,浏览器使用相同的'file1'名称元素创建多个文件。这就像是一个列表框的多选。

那么如何使用Request.Files集合在ASP.NET中捕获它? Request.Files.AllKeys集合显示所有文件,但键值完全相同。 Request.Files返回每个键的字符串,但我只能使用键检索第一个文件:

var file = Request.Files["file1"];

这给了我第一个文件,但我无法访问以这种方式选择的其他文件,因为它们没有唯一的名称。迭代也不起作用,因为Request.Files只返回键而不是实际的文件条目。

如何在ASP.NET中捕获这些辅助文件?

3 个答案:

答案 0 :(得分:5)

首先,你是对的,Request.Files集合的所有都是'file1'(或者输入元素的名称恰好是什么)。

但是,您可以通过索引遍历集合,并使用每个HttpPostedFileBase对象的“Filename”属性检索每个上载的文件名。

每个对象也将包含一个InputStream,当我在Visual Studio中调试它时,我可以从Length属性中看到该流实际上包含每个图像的内容。

示例:

[HttpPost]
public ActionResult Upload()
{
    for (int i = 0; i < Request.Files.Count; i++)
    {
        Console.WriteLine(Request.Files[i].FileName);
        Console.WriteLine(Request.Files[i].InputStream.Length);
    }

    return View();
}

我猜ASP.NET团队没有预料到多文件上传。您可以编写一个适配器类来将Request.Files转换为具有HttpPostedFileWrapper迭代器的集合,因此您可以使用for / each结构。

答案 1 :(得分:0)

我不确定你是否使用MVC,但如果是这样,试试这个:

 [HttpPost]
    public ActionResult Upload(HttpPostedFileBase[] files)
    {
       // Stuff with files
    }

每个文件都有一个InputStream属性,可用于访问内容。

此外,您还需要指定enctype属性:

<form action="" method="POST" enctype="multipart/form-data">

希望这会有所帮助。我使用类似的代码来处理通过此jQuery file upload plugin发送的文件。

答案 2 :(得分:0)

<input id="File1" type="file" runat="server" size="60" multiple="" />
in .cs file HttpFileCollection uploads = HttpContext.Current.Request.Files; for (int i = 0; i < uploads.Count; i++) { HttpPostedFile upload = uploads[i]; Response.Write(@"alert('"+upload.FileName+"');"); }

我认为这可能有用......