2010-11-19 2 views
15

tôi có như sau:jQuery - INPUT type = Tệp, tùy chọn Xác thực Loại tệp Hình ảnh?

<input id="user_profile_pic" name="user[profile_pic]" type="file"> 

Trên máy chủ tôi kiểm tra để chắc chắn rằng nó là một hình ảnh, nhưng tôi muốn kiểm tra trên clientside đầu tiên.

Làm cách nào để jQuery có thể cảnh báo người dùng nếu tệp đầu vào tệp được chọn không phải là gif, jpg, png hoặc bmp?

Cảm ơn

Trả lời

26

Bạn muốn kiểm tra những gì giá trị của nguyên tố này là, một cái gì đó dọc theo dòng:

$("#user_profile_pic").change(function() { 

    var val = $(this).val(); 

    switch(val.substring(val.lastIndexOf('.') + 1).toLowerCase()){ 
     case 'gif': case 'jpg': case 'png': 
      alert("an image"); 
      break; 
     default: 
      $(this).val(''); 
      // error message here 
      alert("not an image"); 
      break; 
    } 
}); 

Sửa

thay đổi Mã dựa trên nhận xét - bây giờ loại bỏ giá trị của các tập tin được lựa chọn nếu không phải là một hình ảnh.

+0

Loại không bắt buộcNhấp: Đối tượng # không có phương pháp 'trao đổi' – AnApprentice

+0

.thay đổi. Nhưng nó vẫn không tốt, như trong khi nó lỗi, nó vẫn chọn và đang hiển thị các tập tin trên trang. – AnApprentice

+0

Thêm thao tác này, ".val ('');" nhưng tôi không biết làm thế nào tuân thủ đó là ... bất cứ ai? – AnApprentice

7

Bạn có thể sử dụng một biểu thức chính quy:

var val = $("#user_profile_pic").val(); 
if (!val.match(/(?:gif|jpg|png|bmp)$/)) { 
    // inputted file path is not an image of one of the above types 
    alert("inputted file path is not an image!"); 
} 

Tất nhiên bạn có thể thêm các định dạng hơn để các biểu thức chính quy. Có nhiều cách phức tạp và toàn diện hơn để thực hiện việc này, nhưng phương pháp này sẽ hoàn thành nhiệm vụ miễn là đường dẫn tệp hình ảnh kết thúc bằng phần mở rộng tệp hình ảnh chuẩn.

+0

gì nếu có ba tập tin đầu vào và tôi muốn xác nhận họ từng người một? 'var val1 = ...', 'var val2 = ...' 'var val3 = ...' 'if (! val.match (/ (?: gif | jpg | png | bmp) $ /)) { ' – alisa

1

Có thể có các trình duyệt cho phép bạn tạo <img/> của đường dẫn đã cho, bạn có thể kiểm tra xem đó có phải là hình ảnh thực hay không (nếu không phải sự kiện onerror sẽ kích hoạt hình ảnh và nó sẽ có chiều rộng/chiều cao là 0).

Nhưng vì điều này chỉ hoạt động trong một số trình duyệt và là một nguy cơ bảo mật (trong tâm trí của tôi), tôi sẽ không đề xuất làm điều này, vì vậy câu trả lời của tôi là: bạn không thể xác thực ở đó.

Kiểm tra các phần mở rộng tệp như đề xuất của Alex có thể là một tùy chọn, nhưng phần mở rộng tệp không đảm bảo nếu đó là hình ảnh. Tuy nhiên, như là một kiểm tra trước đơn giản (không xác nhận) nó có thể hữu ích.

9

Rất đơn giản, không cần bất kỳ xác thực JavaScript nào. Chỉ cần viết và nó sẽ chỉ chấp nhận các tệp hình ảnh.

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

thật thú vị nhưng nó không hoạt động như xác thực! nó chỉ là để xử lý dễ dàng hơn để chọn một hình ảnh từ một thư mục với phần mở rộng khác nhau. như bạn có thể thấy ở đây -> http://imageshack.us/a/img20/8451/switchzz.jpg – bernte

+0

Việc xác định nó trong HTML có thể được ghi đè trong một số trình duyệt bằng cách chọn "tất cả các tệp" trong hộp thoại tệp. Hai, mặc dù nó trong nó của chính nó không phải là bằng chứng đánh lừa 100%, xác nhận nó với javascript là một rào cản nối thêm trong cuộc chiến chống lại các hoạt động độc hại. Tất cả trong tất cả các bạn muốn có backend của bạn xác nhận trước khi chấp nhận, và như là một tiền thưởng thêm bằng cách kiểm tra và xác nhận các byte đầu tiên của tập tin để xác nhận nó là một loại bạn thực sự muốn, kể từ khi mở rộng một mình không bao giờ là một bằng chứng fool. – chris

1

Làm cách nào để kiểm tra, người dùng đó có chọn tệp hình ảnh không?

  • Bằng cách xác nhận mở rộng tập tin
    Đó là công việc như mong đợi, tập tin văn bản với .png mở rộng vượt qua đây
  • input[type=file][accept=image/*] Nó ban đầu ẩn non-image tập tin từ người dùng. Nhưng bộ lọc này cũng hoạt động theo các phần mở rộng. Và người dùng vẫn có thể nhập thủ công bất kỳ tên tệp hiện có nào.
  • Chúng tôi có thể kiểm tra loại kết quả mime dataUrl, bắt đầu bằng data:mimetype;base64,.... Vì vậy, chúng tôi cần image/* mimetype.

    var file = $('#uploadfile'); 
    file.on('change', function (e) { 
        var reader = new FileReader(); 
    
        reader.onload = function() { 
         var data = reader.result; 
         if (data.match(/^data:image\//)) { 
          $('#thumbnail').attr('src', data); 
         } else { 
          console.error('Not an image'); 
         } 
        }; 
    
        reader.readAsDataURL(file.prop('files')[0]); 
    });