จะมี jQuery จำกัด ประเภทไฟล์ในการอัพโหลดได้อย่างไร?


134

ฉันต้องการให้ jQuery จำกัด ช่องอัพโหลดไฟล์ไว้ที่ jpg / jpeg, png และ gif เท่านั้น ฉันกำลังตรวจสอบแบ็กเอนด์ด้วยPHPอยู่แล้ว ฉันใช้ปุ่มส่งผ่านJavaScriptฟังก์ชั่นอยู่แล้วดังนั้นฉันเพียงแค่ต้องรู้วิธีตรวจสอบประเภทไฟล์ก่อนส่งหรือแจ้งเตือน

คำตอบ:


284

คุณจะได้รับค่าของฟิลด์ไฟล์เหมือนกับฟิลด์อื่น ๆ อย่างไรก็ตามคุณไม่สามารถแก้ไขได้

ดังนั้นหากต้องการตรวจสอบอย่างผิวเผินว่าไฟล์มีนามสกุลที่ถูกต้องหรือไม่คุณสามารถทำสิ่งนี้ได้:

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

7
คุณสามารถใช้ได้$('#file_field').change(function(){// above check});
makki

3
$("#my_upload_form").bind("submit", function() { // above check });ขณะนี้ควรจะผูกพันใช้api.jquery.com/submit$("#my_upload_form").submit(function() { // above check }); คุณยังสามารถป้องกันการส่งแบบฟอร์มโดยใช้$("#my_upload_form").submit(function(e) { // above check e.preventDefault(); });
Liam

1
ในกรณีนี้หากผู้ใช้จะเพิ่ม".jpg" ตัวอย่างลงในไฟล์ MS Word FileUpload จะยอมรับไฟล์นี้เป็นรูปภาพ คิดว่าไม่น่าใช่
Jeyhun

3
มันคุ้มค่าที่จะระบุว่านี่ไม่ใช่วิธีการพิสูจน์คนโง่ .. ในตอนท้ายของวันตรวจสอบให้แน่ใจว่าแบ็กเอนด์ของคุณกำลังตรวจสอบไฟล์สองสามไบต์แรกเพื่อให้แน่ใจว่ามันไม่ตรงกับประเภทไฟล์ที่คุณต้องการจริงๆ สิ่งที่ต้องคิดอีกอย่างคือใน linux และ osx คุณสามารถมีไฟล์ที่ไม่มีนามสกุลที่เป็นประเภทที่คุณต้องการได้จริงๆ .. ดังนั้นสิ่งนี้ก็จะล้มเหลวเช่นกัน
chris

40

ไม่จำเป็นต้องใช้ปลั๊กอินสำหรับงานนี้ ผสมผสานสิ่งนี้เข้าด้วยกันจากสคริปต์อื่น ๆ :

$('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

มีกฎยอมรับ () ที่ทำสิ่งที่คุณต้องการ: http://docs.jquery.com/Plugins/Validation/Methods/accept#extension

โปรดทราบว่าการควบคุมนามสกุลไฟล์ไม่ใช่การพิสูจน์สัญลักษณ์แสดงหัวข้อย่อยเนื่องจากไม่เกี่ยวข้องกับ mimetype ของไฟล์ ดังนั้นคุณสามารถมี. png ที่เป็นเอกสารคำและ. doc ซึ่งเป็นภาพ png ที่ใช้ได้อย่างสมบูรณ์แบบ ดังนั้นอย่าลืมทำการควบคุมฝั่งเซิร์ฟเวอร์ให้มากขึ้น;)


คุณช่วยยกตัวอย่างการใช้งานนี้กับplugins.krajee.com/file-input#option-allowedfileextensionsบน IE11 ได้ไหม
shorif2000

25

สำหรับส่วนหน้าจะค่อนข้างสะดวกในการใส่แอตทริบิวต์ " ยอมรับ " หากคุณใช้ฟิลด์ไฟล์

ตัวอย่าง:

<input id="file" type="file" name="file" size="30" 
       accept="image/jpg,image/png,image/jpeg,image/gif" 
/>

หมายเหตุสำคัญสองประการ:


1
ดีกว่าใช้ JQuery มาก
Christopher Grigg

19

ไม่ต้องการตรวจสอบมากกว่า MIME มากกว่าส่วนขยายใด ๆ ที่ผู้ใช้โกหก? ถ้าเป็นเช่นนั้นจะน้อยกว่าหนึ่งบรรทัด:

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

ไม่ได้รับสิ่งที่เขาต้องการ เป็นเพียงการจัดการที่ง่ายขึ้นในการเลือกภาพจากโฟลเดอร์ที่มีนามสกุลต่างกัน ในขณะที่คุณสามารถดูที่นี่ -> imageshack.us/a/img20/8451/switchzz.jpg
bernte

เนื่องจากไม่ทำร้าย IE <10 และไม่ทำร้ายโค้ดอื่นจึงเป็นข้อ จำกัด ที่มีประสิทธิภาพสำหรับสิ่งที่คุณพยายาม จำกัด
ลีโอ


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 Check this link pls stackoverflow.com/questions/6575159/…
DmitryBoyko

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
Qammar Feroz

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

นี่คือรหัสง่ายๆสำหรับการตรวจสอบความถูกต้องของจาวาสคริปต์และหลังจากตรวจสอบแล้วจะทำความสะอาดไฟล์อินพุต

<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("");
    }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.