HTML:如何将文件上传限制为仅图片?


126

使用HTML,我如何限制可以上传的文件类型?

为了简化用户体验,我希望将文件上传限制为仅图像(jpeg,gif,png)。

<form method="post" action="..." enctype="multipart/form-data">
<label for="image">Photo</label>
<input name="image" type="file" />
</form>

显然,要妥善保护这一点,我将在后端/服务器端进行检查。但是,我所寻找的只是一种简单的用户体验,因此,当他们单击“浏览”以查找要上传的图像时,他们不必查看所有那些不适用的Word文档,等等。上传
JacobT

我不知道您可以设置文件掩码。我从未见过成功完成。
罗伯特·K

Answers:


230

HTML5说<input type="file" accept="image/*">。当然,永远不要信任客户端验证:总是在服务器端再次检查...


87

HTML5文件输入具有接受属性,也具有多个属性。通过使用多个属性,您可以在一个实例中上传多个图像。

<input type="file" multiple accept='image/*'>

您还可以限制多种mime类型。

<input type="file" multiple accept='image/*|audio/*|video/*' >

另一种使用文件对象检查mime类型的方法。

文件对象为您提供名称,大小和类型。

var files=e.target.files;

var mimeType=files[0].type; // You can get the mime type

您还可以通过上述代码限制用户上传某些文件类型。


4
image/*|audio/*|video/*不适用于我,应该用逗号分隔,似乎:image/*,video/mp4,.txt
serg '16

非常适合检查mimeType!Tx!
Pedro Ferreira


6

这是用于图像上传的HTML。默认情况下,由于我们已经放置了,因此它将仅在浏览窗口中显示图像文件accept="image/*"。但是我们仍然可以从下拉列表中进行更改,它将显示所有文件。因此,JavaScript部分会验证所选文件是否为实际图像。

 <div class="col-sm-8 img-upload-section">
     <input name="image3" type="file" accept="image/*" id="menu_images"/>
     <img id="menu_image" class="preview_img" />
     <input type="submit" value="Submit" />
 </div> 

在更改事件中,我们首先检查图像的大小。在第二种if情况下,我们检查它是否是图像文件。

this.files[0].type.indexOf("image")-1如果它不是一个图像文件。

document.getElementById("menu_images").onchange = function () {
    var reader = new FileReader();
    if(this.files[0].size>528385){
        alert("Image Size should not be greater than 500Kb");
        $("#menu_image").attr("src","blank");
        $("#menu_image").hide();  
        $('#menu_images').wrap('<form>').closest('form').get(0).reset();
        $('#menu_images').unwrap();     
        return false;
    }
    if(this.files[0].type.indexOf("image")==-1){
        alert("Invalid Type");
        $("#menu_image").attr("src","blank");
        $("#menu_image").hide();  
        $('#menu_images').wrap('<form>').closest('form').get(0).reset();
        $('#menu_images').unwrap();         
        return false;
    }   
    reader.onload = function (e) {
        // get loaded data and render thumbnail.
        document.getElementById("menu_image").src = e.target.result;
        $("#menu_image").show(); 
    };

    // read the image file as a data URL.
    reader.readAsDataURL(this.files[0]);
};

请添加说明。
保罗·斯威兹

请注意,以上要求使用jquery,但没有这么说。很容易找出来,但有助于说明。我为此制造了一个小提琴。它可以做其他一些事情(根据项目的要求),但是概念是完全相同的。
Dave Land

1

您只能在服务器端安全地执行此操作。使用“ accept”属性是好的,但是还必须在服务器端进行验证,以免用户可以使用cURL到您的脚本而不受此限制。

我建议您:丢弃任何非图像文件,警告用户,然后重新显示表单。


1
<script>

    function chng()
    {
        var typ=document.getElementById("fiile").value;
        var res = typ.match(".jp");

        if(res)
        {
            alert("sucess");
        }
        else
        {
            alert("Sorry only jpeg images are accepted");
            document.getElementById("fiile").value="; //clear the uploaded file
        }
    }

</script>

现在在html部分

<input type="file" onchange="chng()">

此代码将检查上传的文件是否为jpg文件,并限制其他类型的上传


通过简单重命名文件扩展名可以取消此检查。如果要执行以下操作,则至少应检查数据URI类型。
卢卡斯·勒布朗

0

最终,显示在“浏览”窗口中的过滤器由浏览器设置。您可以在“接受”属性中指定所需的所有过滤器,但不能保证用户的浏览器将遵守该过滤器。

最好的选择是在服务器后端进行某种筛选。


0

检出一个名为Uploadify的项目。http://www.uploadify.com/

这是一个基于Flash + jQuery的文件上传器。这使用Flash的文件选择对话框,使您能够过滤文件类型,同时选择多个文件,等等。


30
快闪了吗?
ErickBest 2013年

14
有史以来最糟糕的解决方案。
Matteo Mosconi 2013年

1
伙计们,我不明白为什么这是有史以来最糟糕的解决方案。尽管确实是Flash即将消失,但它仍被旧的浏览器使用-很老,可以,但仍在使用-此解决方案同时具有两种技术:jQuery + HTML5和Flash后备。它与VideoJS一样好,如果浏览器无法播放视频,VideoJS会具有Flash备用功能...我尚未测试过该解决方案,它可能不是最好的,但是不赞成投票是不公平的。
Unapedra 2014年

1
+1傻可以投反对票。Flash即将消失,但具有良好的后备功能。您认为Google用于gmail的Gmail用于套接字后备吗?愚蠢。
杰森·塞布林2014年

8
这个答案是4岁。当时,任何主流浏览器都没有很好地支持HTML5支持多个文件选择或按接受的类型过滤选择文件窗口。这是当时很多人都可以使用的解决方案,但现在我将转向纯HTML5解决方案。
AndrewR 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.