jQuery如何限制上传文件的类型?


133

我想让jQuery将文件上传字段限制为仅jpg / jpeg,png和gif。我已经在进行后端检查了PHP。我JavaScript已经通过函数运行了提交按钮,因此我真的只需要知道在提交或发出警报之前如何检查文件类型。

Answers:


280

您可以获得与任何其他字段相同的文件字段的值。但是,您不能更改它。

因此,要表面检查文件的扩展名是否正确,可以执行以下操作:

var ext = $('#my_file_field').val().split('.').pop().toLowerCase();
if($.inArray(ext, ['gif','png','jpg','jpeg']) == -1) {
    alert('invalid extension!');
}

18
并将其绑定到您的表单: $("#my_upload_form").bind("submit", function() { // above check });
321X 2011年

7
您可以使用$('#file_field').change(function(){// above check});
makki 2012年

3
$("#my_upload_form").bind("submit", function() { // above check });现在应该使用$("#my_upload_form").submit(function() { // above check }); api.jquery.com/submit进行绑定。您也可以使用$("#my_upload_form").submit(function(e) { // above check e.preventDefault(); });
Liam 2012年

1
在这种情况下,如果用户将".jpg" 例如添加到MS Word文件中,则FileUpload将接受该文件作为图片。我认为这是不对的。
Jeyhun 2014年

3
值得一提的是,这不是一种简单的方法。最后,请确保您的后端正在检查文件的前几个字节,以确保该文件实际上是您真正想要的文件类型。另一件事要考虑的是,在linux和osx中,您可以拥有一个没有扩展名的文件,而该扩展名实际上就是您想要的类型。因此这也将失败
chris

39

无需插件即可完成此任务。通过其他几个脚本将其拼凑起来:

$('INPUT[type="file"]').change(function () {
    var ext = this.value.match(/\.(.+)$/)[1];
    switch (ext) {
        case 'jpg':
        case 'jpeg':
        case 'png':
        case 'gif':
            $('#uploadButton').attr('disabled', false);
            break;
        default:
            alert('This is not an allowed file type.');
            this.value = '';
    }
});

这里的窍门是将上载按钮设置为禁用,除非并且直到选择了有效的文件类型。


6
抱歉,兄弟,但这是一个不好的正则表达式。文件名称中可以包含点。“ giel.asd.aaaaa.jpg.png” .match(/\.(.+)$/)–
Tim Kretschmer

27

您可以将验证插件用于jQuery:http : //docs.jquery.com/Plugins/Validation

它碰巧有一个完全满足您需要的accept()规则:http : //docs.jquery.com/Plugins/Validation/Methods/accept#extension

请注意,控制文件扩展名不是防弹的,因为它与文件的模仿类型无关。因此,您可能会有一个.png文件,一个.doc文件,它是一个完全有效的png图像。因此,不要忘记在服务器端进行更多控制;)


您能提供示例如何在IE11上通过plugins.krajee.com/file-input#option-allowedfileextensions使用此示例
shorif2000


19

不想只检查MIME,而不要检查用户在撒谎的程度?如果是这样,则少于一行:

<input type="file" id="userfile" accept="image/*|video/*" required />

没有得到他所需要的。只是为了更轻松地从具有不同扩展名的文件夹中选择图像。如您所见-> imageshack.us/a/img20/8451/switchzz.jpg
伯尔尼

由于它不会损害IE <10,也不会损害其他代码,因此它是对您要限制的有效限制。
Leo

4

就我而言,我使用以下代码:

    if (!(/\.(gif|jpg|jpeg|tiff|png)$/i).test(fileName)) {              
    alert('You must select an image file only');               
    }

3

我尝试编写工作代码示例,对其进行测试,然后一切正常。

野兔是代码:

HTML:

<input type="file" class="attachment_input" name="file" onchange="checkFileSize(this, @Model.MaxSize.ToString(),@Html.Raw(Json.Encode(Model.FileExtensionsList)))" />

Javascript:

 //function for check attachment size and extention match
function checkFileSize(element, maxSize, extentionsArray) {
    var val = $(element).val(); //get file value

    var ext = val.substring(val.lastIndexOf('.') + 1).toLowerCase(); // get file extention 
    if ($.inArray(ext, extentionsArray) == -1) {
        alert('false extension!');
    }

    var fileSize = ($(element)[0].files[0].size / 1024 / 1024); //size in MB
    if (fileSize > maxSize) {
        alert("Large file");// if Maxsize from Model > real file size alert this
    }
}

1

这段代码可以正常工作,但是唯一的问题是,如果文件格式不是指定的选项,它会显示一条警告消息,但是会显示文件名,而应该忽略它。

$('#ff2').change(
                function () {
                    var fileExtension = ['jpeg', 'jpg', 'pdf'];
                    if ($.inArray($(this).val().split('.').pop().toLowerCase(), fileExtension) == -1) {
                        alert("Only '.jpeg','.jpg','.pdf' formats are allowed.");
                        return false; }
});

1

此示例仅允许上传PNG图片。

的HTML

<input type="file" class="form-control" id="FileUpload1" accept="image/png" />

JS

$('#FileUpload1').change(
                function () {
                    var fileExtension = ['png'];
                    if ($.inArray($(this).val().split('.').pop().toLowerCase(), fileExtension) == -1) {
                        alert("Only '.png' format is allowed.");
                        this.value = ''; // Clean field
                        return false;
                    }
                });

您能否建议如何限制图像尺寸。例如,10mb大小的图像不应接受
PDSSandeep

@PDSSandeep检查此链接请stackoverflow.com/questions/6575159/...
开发者

0
<form enctype="multipart/form-data">
   <input name="file" type="file" />
   <input type="submit" value="Upload" />
</form>
<script>
$('input[type=file]').change(function(){
    var file = this.files[0];
    name = file.name;
    size = file.size;
    type = file.type;
    //your validation
});
</script>

无法检查文件的大小和大小(在FF中测试)。
卡玛·费罗兹

0

如果您要处理多个(html 5)文件上载,我将建议的最上面的注释修改为以下内容:

    var files = $('#file1')[0].files;
    var len = $('#file1').get(0).files.length;

    for (var i = 0; i < len; i++) {

        f = files[i];

        var ext = f.name.split('.').pop().toLowerCase();
        if ($.inArray(ext, ['gif', 'png', 'jpg', 'jpeg']) == -1) {
            alert('invalid extension!');

        }
    }

0
    $("input[name='btnsubmit']").attr('disabled', true);
    $('input[name="filphoto"]').change(function () {
    var ext = this.value.match(/\.(.+)$/)[1];
    switch (ext) 
    {
    case 'jpg':
    case 'jpeg':
    case 'png':
    case 'bmp':
        $("input[name='btnsubmit']").attr('disabled', false);
    break;
    default:
        alert('This is not an allowed file type.');
        $("input[name='btnsubmit']").attr('disabled', true);
        this.value = '';

-1
function validateFileExtensions(){
        var validFileExtensions = ["jpg", "jpeg", "gif", "png"];
        var fileErrors = new Array();

        $( "input:file").each(function(){
            var file = $(this).value;
            var ext = file.split('.').pop();
            if( $.inArray( ext, validFileExtensions ) == -1) {
                fileErrors.push(file);
            }
        });

        if( fileErrors.length > 0 ){
            var errorContainer = $("#validation-errors");
            for(var i=0; i < fileErrors.length; i++){
                errorContainer.append('<label for="title" class="error">* File:'+ file +' do not have a valid format!</label>');
            }
            return false;
        }
        return true;
    }

-1

这是用于javascript验证的简单代码,验证后将清除输入文件。

<input type="file" id="image" accept="image/*" onChange="validate(this.value)"/>

function validate(file) {
    var ext = file.split(".");
    ext = ext[ext.length-1].toLowerCase();      
    var arrayExtensions = ["jpg" , "jpeg", "png", "bmp", "gif"];

    if (arrayExtensions.lastIndexOf(ext) == -1) {
        alert("Wrong extension type.");
        $("#image").val("");
    }
}
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.