Làm cách nào để kiểm tra kích thước đầu vào của tệp với jQuery?


135

Tôi có một biểu mẫu với khả năng tải lên tệp và tôi muốn có thể có một số báo cáo lỗi phía máy khách tốt nếu tệp mà người dùng đang cố tải lên quá lớn, có cách nào để kiểm tra kích thước tệp bằng jQuery, hoàn toàn không trên máy khách hoặc bằng cách nào đó đăng tập tin trở lại máy chủ để kiểm tra?

Câu trả lời:


275

Bạn thực sự không có quyền truy cập vào hệ thống tệp (ví dụ: đọc và ghi tệp cục bộ), tuy nhiên, do đặc tả Api của tệp HTML5, có một số thuộc tính tệp mà bạn có quyền truy cập và kích thước tệp là một trong số đó.

Đối với HTML bên dưới

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

hãy thử như sau:

//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);

});

Vì nó là một phần của đặc tả HTML5, nó sẽ chỉ hoạt động cho các trình duyệt hiện đại (v10 cần thiết cho IE) và tôi đã thêm vào đây thêm chi tiết và liên kết về thông tin tệp khác mà bạn nên biết: http://felipe.sabino.me/javascript / 2012/01/30 / javascipt-tests-the-file-size /


Hỗ trợ trình duyệt cũ

Xin lưu ý rằng các trình duyệt cũ sẽ trả về nullgiá trị cho this.filescuộc gọi trước đó , vì vậy việc truy cập this.files[0]sẽ đưa ra một ngoại lệ và bạn nên kiểm tra hỗ trợ API tệp trước khi sử dụng


6
Mọi người đều nói điều này không thể thực hiện được - nhưng đây rồi. Những công việc này. Tôi đã thử nó.
Peter

35
@Jeroen Tôi đồng ý rằng việc không làm việc cho IE khiến nó không phải là giải pháp lý tưởng cho nhiều người, nhưng không bỏ phiếu và nói rằng câu trả lời là vô ích một chút quá nhiều? Tôi đã sử dụng giải pháp này trong rất nhiều giải pháp web doanh nghiệp có phạm vi cần chỉ hoạt động trong chrome và / hoặc firefox, và một số người tìm kiếm giải pháp này có thể ở cùng một chỗ, vì vậy giải pháp này sẽ đủ tốt .
Felipe Sabino

3
Tôi vừa bắt gặp câu trả lời này trên Google và tôi sẽ sử dụng nó để ngăn người dùng đăng các tệp có kích thước nhất định; vì tôi cũng kiểm tra kích thước tệp ở phía máy chủ, tôi rất vui khi có giải pháp phía máy khách không hoạt động trong IE8.
Steve Wilkes

2
@GaolaiPeng Lỗi này có thể là do jQuerytệp javascript không được thêm vào (hoặc nó không được tải đúng cách). Bạn có thêm nó vào headtrang của bạn không?
Felipe Sabino

1
@volumeone Đó là lý do tại sao tôi nói bạn nên "kiểm tra hỗ trợ API tệp trước khi sử dụng" trong câu trả lời của tôi và sau đó bạn có thể thay đổi giao diện người dùng phù hợp.
Felipe Sabino

41

Nếu bạn muốn sử dụng jQuery, validatebạn có thể bằng cách tạo phương thức này:

$.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) 
});

Bạn sẽ sử dụng nó:

$('#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
@ Có thể, thuộc tính kích thước tệp là một phần của đặc tả HTML5, vì vậy nó sẽ chỉ hoạt động cho các trình duyệt hiện đại (đối với IE, nó sẽ là phiên bản 10+)
Felipe Sabino

7
Bạn đã sử dụng acceptquy tắc không chính xác , trong đó bạn nên sử dụng extensionquy tắc. ~ Các acceptquy tắc là chỉ cho các loại MIME. Các extensionquy tắc là dành cho phần mở rộng tập tin. Bạn cũng cần bao gồm các additional-methods.jstập tin cho các quy tắc này.
Sparky

Bổ sung nhận xét quyết đoán của 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

26

Mã này:

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

Trả về kích thước tệp cho một đầu vào mẫu.

Trên FF 3.6 trở lên, mã này phải là:

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

2
Mã nắm tay của bạn hoạt động bằng chrome nhưng thứ hai không hoạt động cho FireFox mới nhất.
Débora

Mã thứ hai đó là những gì tôi phải sử dụng cho tất cả các trình duyệt hiện đại (2014+).
Dreamcasting

1
Mã đầu tiên hoạt động IE 10, 11, Edge, Chrome, Safari (phiên bản Windows), Brave và Firefox.
Mashukur Rahman

12

Tôi cũng đang đăng giải pháp của mình, được sử dụng cho một FileUploadđiều khiển ASP.NET . Có lẽ ai đó sẽ thấy nó hữu ích.

    $(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
Bạn cần kiểm tra null giá trị f = this.files[0]hoặc điều này sẽ thất bại trên các trình duyệt cũ hơn. ví dụif (f && (f.size > 8388608 || f.fileSize > 8388608))
Cuốn Mã hóa

9

Sử dụng bên dưới để kiểm tra kích thước tệp và xóa nếu nó lớn hơn,

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

1
Nên sử dụng $ (this) .val (null); Nếu không, biểu mẫu dường như không gửi chính xác nữa mà không chọn tệp đính kèm thích hợp.
Kevin Grabher

1

Bạn có thể thực hiện loại kiểm tra này với Flash hoặc Silverlight nhưng không phải Javascript. Hộp cát javascript không cho phép truy cập vào hệ thống tệp. Kiểm tra kích thước sẽ cần phải được thực hiện phía máy chủ sau khi nó đã được tải lên.

Nếu bạn muốn đi theo tuyến Silverlight / Flash, bạn có thể kiểm tra xem chúng có được cài đặt mặc định cho trình xử lý tải lên tệp thông thường sử dụng các điều khiển thông thường không. Bằng cách này, nếu cài đặt Silverlight / Flash, trải nghiệm của họ sẽ phong phú hơn một chút.


1
<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>

Tôi thấy điều này là dễ nhất nếu bạn không có kế hoạch gửi biểu mẫu thông qua các phương thức ajax / html5 tiêu chuẩn, nhưng tất nhiên nó hoạt động với mọi thứ.

GHI CHÚ:

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

Điều này đã từng hoạt động, nhưng nó không còn trong chrome nữa, tôi chỉ thử mã ở trên và nó hoạt động ở cả ff và chrome (mới nhất). Cái thứ hai ["0"] bây giờ là FirstChild.


0

Vui lòng thử điều này:

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;
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.