จะตรวจสอบขนาดไฟล์เข้าด้วย jQuery ได้อย่างไร?


138

ฉันมีแบบฟอร์มที่มีความสามารถในการอัปโหลดไฟล์และฉันต้องการให้มีการรายงานข้อผิดพลาดฝั่งไคลเอ็นต์ที่ดีหากไฟล์ที่ผู้ใช้พยายามอัปโหลดมีขนาดใหญ่เกินไปมีวิธีตรวจสอบขนาดไฟล์ด้วย jQuery หรือไม่ บนไคลเอนต์หรือโพสต์ไฟล์กลับไปที่เซิร์ฟเวอร์เพื่อตรวจสอบ?

คำตอบ:


278

คุณไม่มีสิทธิ์เข้าถึงระบบไฟล์ (เช่นการอ่านและเขียนไฟล์ในเครื่อง) อย่างไรก็ตามเนื่องจากข้อกำหนดของ HTML5 File Api มีคุณสมบัติของไฟล์บางอย่างที่คุณสามารถเข้าถึงได้และขนาดไฟล์ก็เป็นหนึ่งในนั้น

สำหรับ HTML ด้านล่าง

<input type="file" id="myFile" />

ลองทำดังต่อไปนี้:

//binds to onchange event of your input field
$('#myFile').bind('change', function() {

  //this.files[0].size gets the size of your file.
  alert(this.files[0].size);

});

มันเป็นส่วนหนึ่งของข้อกำหนด HTML5 ก็จะทำงานเฉพาะสำหรับเบราว์เซอร์ที่ทันสมัย (v10 จำเป็นสำหรับ IE) และฉันเพิ่มที่นี่ดูรายละเอียดเพิ่มเติมและการเชื่อมโยงข้อมูลเกี่ยวกับไฟล์อื่น ๆ ที่คุณควรรู้: http://felipe.sabino.me/javascript / 2012/01/30 / javascipt- ตรวจสอบขนาดไฟล์ /


รองรับเบราว์เซอร์รุ่นเก่า

โปรดทราบว่าเบราว์เซอร์เก่าจะส่งคืนnullค่าสำหรับการthis.filesโทรครั้งก่อนดังนั้นการเข้าถึงthis.files[0]จะเพิ่มข้อยกเว้นและคุณควรตรวจสอบการรองรับ File APIก่อนใช้งาน


6
ทุกคนบอกว่าทำไม่ได้ - ยังอยู่ที่นี่ นี้ได้ผล ฉันทดสอบแล้ว
Peter

35
@Jeroen ฉันยอมรับว่าการไม่ทำงานกับ IE ทำให้มันไม่ใช่ทางออกที่ดีสำหรับคนจำนวนมาก แต่ก็ไม่ได้ลงคะแนนและบอกว่าคำตอบนั้นไร้ประโยชน์มากไปหน่อยเหรอ? ฉันใช้โซลูชันนี้ในโซลูชันเว็บระดับองค์กรที่หลากหลายซึ่งจำเป็นต้องทำงานใน Chrome และ / หรือ Firefox เท่านั้นและบางคนที่กำลังมองหาโซลูชันนี้อาจอยู่ในจุดเดียวกันดังนั้นโซลูชันนี้จึงดีพอ .
Felipe Sabino

3
ฉันเพิ่งเจอคำตอบนี้ใน Google และกำลังจะใช้เพื่อหยุดผู้ใช้โพสต์ไฟล์ที่มีขนาดเกินกำหนด เนื่องจากฉันตรวจสอบขนาดไฟล์ที่ฝั่งเซิร์ฟเวอร์ด้วยฉันยินดีที่จะมีโซลูชันฝั่งไคลเอ็นต์ซึ่งใช้ไม่ได้ใน IE8
สตีฟวิลค์ส

2
@GaolaiPeng ข้อผิดพลาดนี้อาจเป็นเพราะjQueryไม่ได้เพิ่มไฟล์ javascript (หรือโหลดไม่ถูกต้อง) คุณได้เพิ่มไว้ในheadหน้าของคุณหรือไม่?
Felipe Sabino

1
@volumeone นั่นคือเหตุผลที่ฉันบอกว่าคุณควร "ตรวจสอบการรองรับ File API ก่อนใช้งาน" ในคำตอบของฉันจากนั้นคุณสามารถเปลี่ยน UI ได้ตามนั้น
Felipe Sabino

44

หากคุณต้องการใช้ jQuery validateคุณสามารถทำได้โดยการสร้างวิธีนี้:

$.validator.addMethod('filesize', function(value, element, param) {
    // param = size (en bytes) 
    // element = element to validate (<input>)
    // value = value of the element (file name)
    return this.optional(element) || (element.files[0].size <= param) 
});

คุณจะใช้มัน:

$('#formid').validate({
    rules: { inputimage: { required: true, accept: "png|jpe?g|gif", filesize: 1048576  }},
    messages: { inputimage: "File must be JPG, GIF or PNG, less than 1MB" }
});

1
@Dan ใช่คุณสมบัติขนาดไฟล์เป็นส่วนหนึ่งของข้อกำหนด HTML5 ดังนั้นจึงใช้ได้เฉพาะกับเบราว์เซอร์ที่ทันสมัยเท่านั้น (สำหรับ IE จะเป็นเวอร์ชัน 10+)
Felipe Sabino

7
คุณใช้acceptกฎอย่างไม่ถูกต้องซึ่งคุณควรใช้extensionกฎ ~ กฎเป็นเพียงสำหรับชนิด MIME กฎสำหรับนามสกุลไฟล์ นอกจากนี้คุณยังต้องรวมไฟล์สำหรับกฎเหล่านี้ acceptextensionadditional-methods.js
Sparky

ความคิดเห็นที่กล้าแสดงออกของ @ Sparky: $('#formid').validate({ rules: { inputimage: { required: true, extension: "png|jpe?g|gif", filesize: 1048576 }}, messages: { inputimage: "File must be JPG, GIF or PNG, less than 1MB" } });
victorf

31

รหัสนี้:

$("#yourFileInput")[0].files[0].size;

ส่งกลับขนาดไฟล์สำหรับอินพุตแบบฟอร์ม

ใน FF 3.6 และใหม่กว่ารหัสนี้ควรเป็น:

$("#yourFileInput")[0].files[0].fileSize;

2
รหัสกำปั้นของคุณใช้งานได้ใน Chrome แต่วินาทีที่สองใช้ไม่ได้กับ FireFox ล่าสุด
Débora

รหัสที่สองคือสิ่งที่ฉันต้องใช้สำหรับเบราว์เซอร์รุ่นใหม่ทั้งหมด (ปี 2014+)
Dreamcasting

1
รหัสแรกใช้งานได้กับ IE 10, 11, Edge, Chrome, Safari (เวอร์ชัน Windows), Brave และ Firefox
Mashukur Rahman

13

ฉันกำลังโพสต์โซลูชันของฉันด้วยซึ่งใช้สำหรับการFileUploadควบคุมASP.NET บางทีอาจจะมีคนคิดว่ามันมีประโยชน์

    $(function () {        
    $('<%= fileUploadCV.ClientID %>').change(function () {

        //because this is single file upload I use only first index
        var f = this.files[0]

        //here I CHECK if the FILE SIZE is bigger than 8 MB (numbers below are in bytes)
        if (f.size > 8388608 || f.fileSize > 8388608)
        {
           //show an alert to the user
           alert("Allowed file size exceeded. (Max. 8 MB)")

           //reset file upload control
           this.value = null;
        }
    })
});

1
คุณต้องตรวจสอบค่าว่างมิf = this.files[0]ฉะนั้นจะล้มเหลวในเบราว์เซอร์รุ่นเก่า เช่นif (f && (f.size > 8388608 || f.fileSize > 8388608))
Gone Coding

10

ใช้ด้านล่างเพื่อตรวจสอบขนาดไฟล์และดูว่ามีขนาดใหญ่กว่าหรือไม่

    $("input[type='file']").on("change", function () {
     if(this.files[0].size > 2000000) {
       alert("Please upload file less than 2MB. Thanks!!");
       $(this).val('');
     }
    });

1
ควรใช้ $ (this) .val (null); มิฉะนั้นดูเหมือนว่าจะส่งแบบฟอร์มไม่ถูกต้องอีกต่อไปโดยไม่ได้เลือกไฟล์แนบที่เหมาะสม
Kevin Grabher

2

คุณสามารถตรวจสอบประเภทนี้ได้ด้วย Flash หรือ Silverlight แต่ไม่ใช่ Javascript จาวาสคริปต์แซนด์บ็อกซ์ไม่อนุญาตให้เข้าถึงระบบไฟล์ การตรวจสอบขนาดจะต้องทำในฝั่งเซิร์ฟเวอร์หลังจากอัปโหลดแล้ว

หากคุณต้องการไปเส้นทาง Silverlight / Flash คุณสามารถตรวจสอบได้ว่าหากไม่ได้ติดตั้งเป็นค่าเริ่มต้นเป็นตัวจัดการการอัปโหลดไฟล์ทั่วไปที่ใช้การควบคุมปกติ ด้วยวิธีนี้หากมีการติดตั้ง Silverlight / Flash ไว้ประสบการณ์ของพวกเขาจะดีขึ้นเล็กน้อย


2
<form id="uploadForm" class="disp-inline" role="form" action="" method="post" enctype="multipart/form-data">
    <input type="file" name="file" id="file">
</form>
<button onclick="checkSize();"></button>
<script>
    function checkSize(){
        var size = $('#uploadForm')["0"].firstChild.files["0"].size;
        console.log(size);
    }
</script>

ฉันพบว่านี่เป็นวิธีที่ง่ายที่สุดหากคุณไม่ได้วางแผนที่จะส่งแบบฟอร์มผ่านวิธี ajax / html5 มาตรฐาน แต่แน่นอนว่ามันใช้ได้กับทุกอย่าง

หมายเหตุ:

var size = $('#uploadForm')["0"]["0"].files["0"].size;

สิ่งนี้เคยใช้งานได้ แต่มันไม่ได้อยู่ในโครเมี่ยมอีกต่อไปฉันเพิ่งทดสอบโค้ดด้านบนและมันใช้งานได้ทั้ง ff และ chrome (ล่าสุด) ["0"] ตัวที่สองคือตอนแรกสำหรับเด็ก


2

โปรดลองสิ่งนี้:

var sizeInKB = input.files[0].size/1024; //Normally files are in bytes but for KB divide by 1024 and so on
var sizeLimit= 30;

if (sizeInKB >= sizeLimit) {
    alert("Max file size 30KB");
    return false;
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.