【问题标题】:How do I capture Uploaded files from HTML 5 multiple file input elements如何从 HTML 5 多个文件输入元素中捕获上传的文件
【发布时间】:2013-12-30 18:43:19
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

    标签: asp.net file-upload


    【解决方案1】:

    首先,Request.Files 集合的所有 都将是“file1”(或者您的输入元素的名称恰好是),这是对的。

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

    每个对象还会包含一个 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 结构。

    【讨论】:

    • 是的 - 只是在您发布的同一时间发布了相同的内容。被键而不是索引值抛出。现在工作!
    • 我删除了我的条目,因为这个总结得很好。
    • 别担心,这是一个很好的问题。
    • @jonathanconway 谢谢你的回答,它节省了我的时间。 :)
    【解决方案2】:

    我不确定您是否使用 MVC,但如果是,请尝试以下操作:

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

    每个文件都有一个 InputStream 属性,您可以使用它来访问内容。

    另外,您需要指定 enctype 属性:

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

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

    【讨论】:

    • 嗯...试过这个,但我只是在文件参数中得到空值。文件正在到达那里 - 我在 Http.Files 集合的键中看到它们。
    • 您的表单标签是什么样的?还是您使用的是 HTMLHelper?
    • 表单动作和你的一样 - 没有动作和 enctype 设置为多部分。上传工作(见我刚刚发布的解决方案)但 HttpPostedFileBase[] 在 MVC4 中没有为我返回任何内容。
    • 为了清楚起见,您的参数在您的操作方法中被命名为“file1”,是吗? input 元素的 name 属性和 action 方法中的参数名称必须匹配,MVC 才能正确绑定。
    • 呃,不,我没有使用相同的名称。因此,这意味着您必须为页面上的每个文件控件拥有一个 HttpPostedFileBase 数组。谢谢!在我目前的情况下,另一种解决方案更好,因为它允许迭代所有上传的文件,但如果页面上有一个框,这很有意义。
    【解决方案3】:
    <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+"');"); }
    

    我认为这可能会奏效......

    【讨论】:

      猜你喜欢
      • 2015-08-12
      • 1970-01-01
      • 2011-09-08
      • 1970-01-01
      • 1970-01-01
      • 2018-01-21
      • 2019-11-30
      • 1970-01-01
      相关资源
      最近更新 更多