<input type ="file">按扩展名限制可选文件

hae*_*mse 70 html input-type-file

有人如何通过扩展名限制输入type ="file"元素可以选择的文件?

我已经知道了accept属性,但是在chrome中它确实通过最后定义的MIME类型限制文件(在本例中为"gif"),FF4甚至不限制任何内容.

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

我做错了吗?或者还有其他方式吗?

你的任何建议......

Edi*_*lic 193

简单的方法是:

<input type="file" accept=".gif,.jpg,.jpeg,.png,.doc,.docx">
Run Code Online (Sandbox Code Playgroud)

适用于所有浏览器,IE9除外.我还没有在IE10 +中测试过它.

  • 在文件输入的“接受”下,还可以定义用于选择的文件的常规类型。例如,如果将“ image / *”放在“ accept”属性下,则该限制将涵盖图像的所有标准文件格式(gif,jpeg等),而不仅限于扩展名类型。另外,您可以组合预定义的类型和扩展名。例如:“ image / * ,. swf”。对于此示例,限制将包括所有标准图像文件和所有“ .swf”文件。注意:用户始终可以从对话框的类型列表中选择“所有文件” ... ;-) (3认同)
  • 这有助于为上传时的文件对话框提供一些过滤,但我绝对认为这也需要与服务器限制结合使用。 (3认同)
  • `accept` 在 Firefox 中不起作用(从 31.0 和 32.0 开始) (2认同)
  • 在 FF 37.0 中测试。工作正常!。 (2认同)
  • @clockw0rk 输入检查和安全性应始终在服务器端实现。接受功能的存在只是为了帮助用户快速过滤相关文件,而不必筛选数千个不相关的文件。 (2认同)

Jos*_*ody 22

注意:这个答案来自2011年.当时这是一个非常好的答案,但截至2015年,大多数浏览器都支持原生HTML属性,因此(通常)不需要在JS中实现这样的自定义逻辑.请参阅Edi的答案文档.


在上传文件之前,您可以使用Javascript检查文件的扩展名,如果表单不匹配,则阻止提交表单.要上载的文件的名称存储在表单元素的"值"字段中.

这是一个简单的例子,只允许上传以".gif"结尾的文件:

<script type="text/javascript">
    function checkFile() {
        var fileElement = document.getElementById("uploadFile");
        var fileExtension = "";
        if (fileElement.value.lastIndexOf(".") > 0) {
            fileExtension = fileElement.value.substring(fileElement.value.lastIndexOf(".") + 1, fileElement.value.length);
        }
        if (fileExtension.toLowerCase() == "gif") {
            return true;
        }
        else {
            alert("You must select a GIF file for upload");
            return false;
        }
    }
</script>

<form action="upload.aspx" enctype="multipart/form-data" onsubmit="return checkFile();">
    <input name="uploadFile" id="uploadFile" type="file" />

    <input type="submit" />
</form>
Run Code Online (Sandbox Code Playgroud)

但是,这种方法并非万无一失.Sean Haddy是正确的,你总是想在服务器端检查,因为用户可以通过关闭javascript或在代码到达浏览器后编辑代码来打败你的Javascript检查.除了客户端检查之外,绝对检查服务器端.另外,我建议检查服务器端的大小,以便用户不会使用2 GB文件崩溃服务器(我不知道在客户端检查文件大小而不使用Flash或Java小程序或其他东西).

然而,使用我在这里给出的方法事先检查客户端仍然有用,因为它可以防止错误,并且对非严重恶作剧是一个小的威慑.

  • 在比较之前你会想要一个toLowerCase() (3认同)

Sea*_*ddy 11

老实说,限制文件的最佳方法是在服务器端.人们可以在客户端上欺骗文件类型,以便在服务器传输时获取完整的文件名,解析出文件类型,然后返回消息通常是最好的选择.

  • 我认为两者都做得更好.为用户提供有关(不)可选文件的前馈,可以节省一些挫折感.因为如果用户花费半分钟精确地选择他需要的文件,然后发现它一无所获..你可以越早越好,越好. (11认同)
  • +1.另外,如果收到的文件太大,我建议在服务器端代码中添加一些东西来停止上传. (7认同)
  • -1. 很好的建议,但问题并没有建议将文件上传到任何地方。它甚至根本没有暗示服务器的存在(例如在完全客户端应用程序的情况下)。如前所述,这个答案应该是评论。 (6认同)