使用<input type ="file">时限制文件格式?

Boj*_*les 595 html types file

当用户单击<input type="file">HTML 中元素中的"浏览"按钮时,我想限制可从本机OS文件选择器中选择的文件类型.我有一种感觉,这是不可能的,但我想知道是否有一个解决方案.我想完全依赖于HTML和JavaScript; 请不要闪光.

Sac*_*eph 991

严格来说,答案是否定的.开发人员无法阻止用户在本机OS文件选择对话框中选择任何类型或扩展名的文件.

但仍然,accept属性<input type = "file">可以帮助在OS的文件选择对话框中提供过滤器.例如,

<!-- (IE 10+, Edge, Chrome, Firefox 42+) -->
<input type="file" accept=".xls,.xlsx" />
Run Code Online (Sandbox Code Playgroud)

应该提供一种过滤除.xls或.xlsx以外的文件的方法.尽管元素的MDN页面input始终表示它支持这一点,但令我惊讶的是,这在Firefox版本42中对我不起作用.这适用于IE 10 +,Edge和Chrome.

因此,为了支持42岁以上的Firefox以及IE 10 +,Edge,Chrome和Opera,我想最好使用以逗号分隔的MIME类型列表:

<!-- (IE 10+, Edge, Chrome, Firefox) -->
<input type="file"
 accept="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.ms-excel" /> 
Run Code Online (Sandbox Code Playgroud)

[ 边缘行为:文件类型过滤器下拉列表显示此处提到的文件类型,但不是下拉列表中的默认值.默认过滤器是All files (*).]

您还可以在MIME类型中使用星号.例如:

<input type="file" accept="image/*" /> <!-- all image types --> 
<input type="file" accept="audio/*" /> <!-- all audio types --> 
<input type="file" accept="video/*" /> <!-- all video types --> 
Run Code Online (Sandbox Code Playgroud)

W3C 建议作者在accept属性中指定MIME类型和相应的扩展名.所以,最好的方法是:

<!-- Right approach: Use both file extensions and corresponding MIME-types. -->
<!-- (IE 10+, Edge, Chrome, Firefox) -->
<input type="file"
 accept=".xls,.xlsx, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.ms-excel" /> 
Run Code Online (Sandbox Code Playgroud)

JSFiddle相同:这里.

参考: MIME类型列表

重要信息:使用accept属性仅提供过滤不感兴趣类型的文件的方法.浏览器仍然允许用户选择任何类型的文件.应该进行额外的(客户端)检查(使用JavaScript,一种方式是这样),并且必须在服务器上验证文件类型,使用MIME类型的组合同时使用文件扩展名及其二进制签名(ASP) .NET,PHP,Ruby,Java).您可能还想参考这些 中的文件类型及其幻数,以执行更强大的服务器端验证.

这里有三个 关于文件上传和安全性的 读物.

编辑: 可能使用其二进制签名进行文件类型验证也可以使用HTML(而不是仅仅通过查看扩展名)在客户端使用HTML5文件API完成,但仍然必须在服务器上验证该文件,因为恶意用户仍然可以通过发出自定义HTTP请求来上传文件.

  • @Sandesire我认为你不能限制HTML中的文件大小.正如您所建议的那样,可以使用JavaScript. (2认同)
  • 从我个人的经验来看,这看起来是一个很好的答案,仅 mime 类型并不适用于所有浏览器。 (2认同)
  • 顺便说一句,“accept”在 Edge 中仍然不起作用:/sf/ask/2231293221/#32214646。更多详细信息请参见:https://wpdev.uservoice.com/forums/257854-microsoft-edge-developer/suggestions/13661175-full-spec-support-for-accept-in-input-type-file (2认同)
  • 我希望我们也可以选择排除文件,例如`exclude="exe"`。¯\_(ツ)_/¯ (2认同)
  • 为了进一步澄清 Edge 行为(根据我的测试),它将根据您指定的内容添加不同的过滤器,但是 a)它没有捆绑,因此它将每个扩展列为单独的选项,b)它总是会添加一些in-构建扩展名,例如 .html,并且 c) 如前所述,它将始终预选择 (*)。这使得它在大多数情况下变得一团糟并且毫无用处。我对用户声音链接进行了投票,希望他们迟早会听到。 (2认同)

The*_*can 193

输入标记有accept属性.但是,它在任何方面都不可靠.浏览器最有可能将其视为"建议",这意味着用户将根据文件管理器进行预选,仅显示所需类型.他们仍然可以选择"所有文件"并上传他们想要的任何文件.

例:

<form>
    <input type="file" name="pic" id="pic" accept="image/gif, image/jpeg" />
</form>
Run Code Online (Sandbox Code Playgroud)

html5规范中阅读更多内容

请记住,它只是用作"帮助",以便用户找到正确的文件.每个用户都可以向服务器发送他/她想要的任何请求.你总是必须验证服务器端的一切.

所以答案是:不,不能限制,但你可以设置预选,但你不能依赖它.

或者或另外,您可以通过使用JavaScript检查文件名(输入字段的值)来执行类似操作,但这是无稽之谈,因为它不提供保护,也不会简化用户的选择.它只会欺骗网站管理员认为他/她受到保护并打开安全漏洞.对于具有替代文件扩展名(例如jpeg而不是jpg),大写或没有任何文件扩展名的用户来说,这可能是一种痛苦(在Linux系统中很常见).

  • 有关其他信息,请参阅http://stackoverflow.com/questions/181214/file-input-accept-attribute-is-it-useful (3认同)

Gab*_*oli 92

您可以使用该change事件来监视用户选择的内容,并在此时通知他们该文件不可接受.它不限制显示的实际文件列表,但除了支持不良的accept属性外,它是客户端最接近的文件.

var file = document.getElementById('someId');

file.onchange = function(e) {
  var ext = this.value.match(/\.([^\.]+)$/)[1];
  switch (ext) {
    case 'jpg':
    case 'bmp':
    case 'png':
    case 'tif':
      alert('Allowed');
      break;
    default:
      alert('Not allowed');
      this.value = '';
  }
};
Run Code Online (Sandbox Code Playgroud)

例如http://www.jsfiddle.net/gaby/7br93/1/

  • @Joe ..好吧..我试着提供方向和声音逻辑.针对每种情况都没有完全实施解决方 我相信观众在从网络上复制/粘贴代码时会使用常识;) (46认同)
  • @joe,这是一个例子......它可以扩展到你想要允许的任何扩展. (10认同)
  • "Some.File.jpg"怎么样?也许正则表达式行需要读取:var ext = this.value.match(/ \.([^.] +)$ /)[1]; (7认同)

Pab*_*ruz 45

是的,你是对的.使用HTML是不可能的.用户可以选择他/她想要的任何文件.

您可以编写一段JavaScript代码,以避免根据其扩展名提交文件.但请记住,这绝不会阻止恶意用户提交他/她真正想要的任何文件.

就像是:

function beforeSubmit()
{
    var fname = document.getElementById("ifile").value;
    // check if fname has the desired extension
    if (fname hasDesiredExtension) {
        return true;
    } else {
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

HTML代码:

<form method="post" onsubmit="return beforeSubmit();">
    <input type="file" id="ifile" name="ifile"/>
</form>
Run Code Online (Sandbox Code Playgroud)

  • @Joe:别说我的回答太糟糕了!:-)无论如何,这不是一个完美的解决方案.正如我在开头所说的那样:"做出OP想要的事情是不可能的".但是,如果您只让他/她选择具有特定扩展名的文件,您可以为用户提供一些**帮助.**REAL**文件类型验证必须完成**服务器端**. (17认同)
  • @JoeHopfgartner:伙计,你在这里对Pablo过于苛刻.客户端验证是在大量的地方完成的,虽然不是万无一失的(应该[b]总是[/ b]包括服务器端验证)它可以节省用户很长时间(没有回发愚蠢的扩展检查等).虽然Pablo提供的脚本并不完美,但它仅仅是为了解决这个问题的一个例子......也许你应该给微软的技术人员发电子邮件,并要求他们从他们的ASP.NET验证器中删除Clientside验证.这对你来说都是垃圾...... (10认同)
  • 有一个完全有效的html属性,所以它是可能的.它只是不受浏览器的尊重,但这是一个标准化问题.以及在无保护标记中处理客户端的任何东西都不能限制任何java脚本无法解决的问题. (3认同)
  • 很好的一点.我将添加第二个PHP检查器以防万一.不能太小心! (2认同)
  • 好吧,如果我也使用PHP验证脚本也没什么坏处,所以我会同时使用它们. (2认同)

小智 19

您可以使用“接受”属性作为文件选择框中的过滤器。使用“accept”可以帮助您根据“后缀”或“MIME 类型”过滤输入文件

1.根据后缀过滤:这里的“accept”属性只允许选择扩展名为.jpeg的文件。

<input type="file" accept=".jpeg" />
Run Code Online (Sandbox Code Playgroud)

2.根据“文件类型”进行过滤这里的“accept”属性只允许您选择“image/jpeg”类型的文件。

<input type="file" accept="image/jpeg" />
Run Code Online (Sandbox Code Playgroud)

重要提示:我们可以更改或删除文件的扩展名,而不更改模因类型。例如,可能有一个没有扩展名的文件,但该文件的类型可以是“image/jpeg”。所以这个文件不能通过accept=".jpeg"过滤器。但它可以通过accept="image/jpeg"。

3.我们可以使用*来选择各种文件类型。例如下面的代码允许选择各种图像。例如“image/png”或“image/jpeg”或...。所有这些都是允许的。

<input type="file" accept="image/*" /> 
Run Code Online (Sandbox Code Playgroud)

4.我们可以在 select 属性中使用逗号( , )作为“或运算符”。例如,要允许所有类型的图像或 pdf 文件,我们可以使用以下代码:

<input type="file" accept="image/* , application/pdf" />
Run Code Online (Sandbox Code Playgroud)


zzz*_*Bov 18

从技术上讲,您可以在元素上指定accept属性(在html5中替代)input,但是它没有得到适当的支持.

  • 没错,最好不要将其用于安全性,但它肯定有助于支持它的浏览器的可用性.用户只显示该站点允许的文件(不是他们在同一文件夹中可能存在的所有其他垃圾),并且他们不必经历整个上载过程以给出错误,他们会立即知道.编码员*应该*使用它. (5认同)

kir*_*nvj 9

使用inputaccept属性的标签

<input type="file" name="my-image" id="image" accept="image/gif, image/jpeg, image/png" />
Run Code Online (Sandbox Code Playgroud)

单击此处获取最新的浏览器兼容性表

现场演示在这里

要仅选择图像文件,您可以使用它 accept="image/*"

<input type="file" name="my-image" id="image" accept="image/*" />
Run Code Online (Sandbox Code Playgroud)

现场演示在这里

只显示gif,jpg和png,屏幕抓取来自Chrome 44版 只显示gif,jpg和png,屏幕抓取来自Chrome 44版


小智 8

我知道这有点晚了.

function Validatebodypanelbumper(theForm)
{
   var regexp;
   var extension =     theForm.FileUpload.value.substr(theForm.FileUpload1.value.lastIndexOf('.'));
   if ((extension.toLowerCase() != ".gif") &&
       (extension.toLowerCase() != ".jpg") &&
       (extension != ""))
   {
      alert("The \"FileUpload\" field contains an unapproved filename.");
      theForm.FileUpload1.focus();
      return false;
   }
   return true;
}
Run Code Online (Sandbox Code Playgroud)


Tru*_*ufa 5

你实际上可以用javascript来做但是记住js是客户端,所以你实际上是"警告用户"他们可以上传什么类型的文件,如果你想要AVOID(限制或限制你说)某些类型的文件你必须做服务器端.

如果您想开始使用服务器端验证,请查看此基本内容.有关整个教程,请访问此页面.

祝好运!


小智 5

正如前面的答案中提到的,我们不能限制用户只为给定的文件格式选择文件。但是在html中的文件属性上使用accept标签真的很方便。

至于验证,我们必须在服务器端进行。我们也可以在客户端用 js 来做,但这不是一个万无一失的解决方案。我们必须在服务器端进行验证。

对于这些需求,我真的更喜欢 struts2 Java web 应用程序开发框架。凭借其内置的文件上传功能,将文件上传到基于 struts2 的网络应用程序是小菜一碟。只需提及我们希望在我们的应用程序中接受的文件格式,其余的都由框架本身的核心处理。您可以在 struts 官方网站上查看。


归档时间:

查看次数:

466371 次

最近记录:

5 年,11 月 前