Kiểm tra chiều rộng và chiều cao của hình ảnh trước khi tải lên bằng Javascript


122

Tôi có một JPS với một biểu mẫu trong đó người dùng có thể đặt một hình ảnh:

<div class="photo">
    <div>Photo (max 240x240 and 100 kb):</div>
    <input type="file" name="photo" id="photoInput" onchange="checkPhoto(this)"/>
</div>

Tôi đã viết js này:

function checkPhoto(target) {
    if(target.files[0].type.indexOf("image") == -1) {
        document.getElementById("photoLabel").innerHTML = "File not supported";
        return false;
    }
    if(target.files[0].size > 102400) {
        document.getElementById("photoLabel").innerHTML = "Image too big (max 100kb)";
        return false;
    }
    document.getElementById("photoLabel").innerHTML = "";
    return true;
}

hoạt động tốt để kiểm tra loại và kích thước tệp. Bây giờ tôi muốn kiểm tra chiều rộng và chiều cao của hình ảnh nhưng tôi không thể thực hiện được.
Tôi đã thử với target.files[0].widthnhưng tôi nhận được undefined. Với những cách khác tôi nhận được 0.
Bất kỳ đề xuất?

Câu trả lời:


221

Tệp chỉ là một tệp, bạn cần tạo một hình ảnh như vậy:

var _URL = window.URL || window.webkitURL;
$("#file").change(function (e) {
    var file, img;
    if ((file = this.files[0])) {
        img = new Image();
        var objectUrl = _URL.createObjectURL(file);
        img.onload = function () {
            alert(this.width + " " + this.height);
            _URL.revokeObjectURL(objectUrl);
        };
        img.src = objectUrl;
    }
});

Demo: http://jsfiddle.net/4N6D9/1/

Tôi hiểu rằng bạn nhận ra điều này chỉ được hỗ trợ trong một số trình duyệt. Chủ yếu là firefox và chrome, bây giờ cũng có thể là opera.

PS Phương thức URL.createObjectURL () đã bị xóa khỏi giao diện MediaStream. Phương pháp này đã không được chấp nhận vào năm 2013 và được thay thế bằng cách gán các luồng cho HTMLMediaElement.srcObject. Phương pháp cũ đã bị xóa vì kém an toàn hơn, yêu cầu lệnh gọi URL.revokeOjbectURL () để kết thúc luồng. Các tác nhân người dùng khác đã không dùng nữa (Firefox) hoặc loại bỏ (Safari) tính năng này.

Thông tin chi tiết vui lòng tham khảo tại đây .


1
chắc chắn nó sẽ không hoạt động trên safari trừ khi bạn có safari 6.0. 6.0 là phiên bản duy nhất hỗ trợ tệp API tính đến thời điểm hiện tại. Và tôi không nghĩ rằng apple sẽ phát hành 6.0 cho windows. 5.1.7 là phiên bản mới nhất của safari từ Soooo từ lâu
Seho Lee

Nó hoạt động trong IE10, nhưng dường như không hoạt động trong IE9 trở xuống. Và đó là bởi vì IE9 trở xuống không hỗ trợ API Tệp ​​( caniuse.com/#search=file%20api )
Michael Yagudaev

28

Theo quan điểm của tôi, câu trả lời hoàn hảo mà bạn phải yêu cầu là

var reader = new FileReader();

//Read the contents of Image File.
reader.readAsDataURL(fileUpload.files[0]);
reader.onload = function (e) {

//Initiate the JavaScript Image object.
var image = new Image();

//Set the Base64 string return from FileReader as source.
image.src = e.target.result;

//Validate the File Height and Width.
image.onload = function () {
  var height = this.height;
  var width = this.width;
  if (height > 100 || width > 100) {
    alert("Height and Width must not exceed 100px.");
    return false;
  }
  alert("Uploaded image has valid Height and Width.");
  return true;
};

18

Tôi đồng ý. Sau khi nó được tải lên một nơi nào đó mà trình duyệt của người dùng có thể truy cập thì việc lấy kích thước khá dễ dàng. Khi bạn cần đợi hình ảnh tải, bạn sẽ muốn tham gia vào onloadsự kiện img.

var width, height;

var img = document.createElement("img");
img.onload = function() {
    // `naturalWidth`/`naturalHeight` aren't supported on <IE9. Fallback to normal width/height
    // The natural size is the actual image size regardless of rendering.
    // The 'normal' width/height are for the **rendered** size.

    width  = img.naturalWidth  || img.width;
    height = img.naturalHeight || img.height; 

    // Do something with the width and height
}

// Setting the source makes it start downloading and eventually call `onload`
img.src = "http://your.website.com/userUploadedImage.jpg";

7

Đây là cách dễ nhất để kiểm tra kích thước

let img = new Image()
img.src = window.URL.createObjectURL(event.target.files[0])
img.onload = () => {
   alert(img.width + " " + img.height);
}

Kiểm tra kích thước cụ thể. Sử dụng 100 x 100 làm ví dụ

let img = new Image()
img.src = window.URL.createObjectURL(event.target.files[0])
img.onload = () => {
   if(img.width === 100 && img.height === 100){
        alert(`Nice, image is the right size. It can be uploaded`)
        // upload logic here
        } else {
        alert(`Sorry, this image doesn't look like the size we wanted. It's 
   ${img.width} x ${img.height} but we require 100 x 100 size image.`);
   }                
}

2

function validateimg (ctrl) {

        var fileUpload = $("#txtPostImg")[0];


        var regex = new RegExp("([a-zA-Z0-9\s_\\.\-:])+(.jpg|.png|.gif)$");
        if (regex.test(fileUpload.value.toLowerCase())) {

            if (typeof (fileUpload.files) != "undefined") {

                var reader = new FileReader();

                reader.readAsDataURL(fileUpload.files[0]);
                reader.onload = function (e) {

                    var image = new Image();

                    image.src = e.target.result;
                    image.onload = function () {

                        var height = this.height;
                        var width = this.width;
                        console.log(this);
                        if ((height >= 1024 || height <= 1100) && (width >= 750 || width <= 800)) {
                            alert("Height and Width must not exceed 1100*800.");
                            return false;
                        }
                        alert("Uploaded image has valid Height and Width.");
                        return true;
                    };
                }
            } else {
                alert("This browser does not support HTML5.");
                return false;
            }
        } else {
            alert("Please select a valid Image file.");
            return false;
        }
    }

1
Vui lòng cố gắng định dạng mã hoàn chỉnh và cung cấp một chút mô tả về những gì bạn đã làm trong mã của mình.
Zeeshan Adil

2

Đính kèm hàm vào phương thức onchange của tệp loại đầu vào / onchange = "validateimg (this)" /

   function validateimg(ctrl) { 
        var fileUpload = ctrl;
        var regex = new RegExp("([a-zA-Z0-9\s_\\.\-:])+(.jpg|.png|.gif)$");
        if (regex.test(fileUpload.value.toLowerCase())) {
            if (typeof (fileUpload.files) != "undefined") {
                var reader = new FileReader();
                reader.readAsDataURL(fileUpload.files[0]);
                reader.onload = function (e) {
                    var image = new Image();
                    image.src = e.target.result;
                    image.onload = function () {
                        var height = this.height;
                        var width = this.width;
                        if (height < 1100 || width < 750) {
                            alert("At least you can upload a 1100*750 photo size.");
                            return false;
                        }else{
                            alert("Uploaded image has valid Height and Width.");
                            return true;
                        }
                    };
                }
            } else {
                alert("This browser does not support HTML5.");
                return false;
            }
        } else {
            alert("Please select a valid Image file.");
            return false;
        }
    }

0

    const ValidateImg = (file) =>{
        let img = new Image()
        img.src = window.URL.createObjectURL(file)
        img.onload = () => {
            if(img.width === 100 && img.height ===100){
                alert("Correct size");
                return true;
            }
            alert("Incorrect size");
            return true;
        }
    }


-1
function uploadfile(ctrl) {
    var validate = validateimg(ctrl);

    if (validate) {
        if (window.FormData !== undefined) {
            ShowLoading();
            var fileUpload = $(ctrl).get(0);
            var files = fileUpload.files;


            var fileData = new FormData();


            for (var i = 0; i < files.length; i++) {
                fileData.append(files[i].name, files[i]);
            }


            fileData.append('username', 'Wishes');

            $.ajax({
                url: 'UploadWishesFiles',
                type: "POST",
                contentType: false,
                processData: false,
                data: fileData,
                success: function(result) {
                    var id = $(ctrl).attr('id');
                    $('#' + id.replace('txt', 'hdn')).val(result);

                    $('#imgPictureEn').attr('src', '../Data/Wishes/' + result).show();

                    HideLoading();
                },
                error: function(err) {
                    alert(err.statusText);
                    HideLoading();
                }
            });
        } else {
            alert("FormData is not supported.");
        }

    }

Chào mừng bạn đến với Stack Overflow! Vui lòng không trả lời chỉ với mã nguồn. Cố gắng cung cấp một mô tả đẹp về cách giải pháp của bạn hoạt động. Xem: Làm thế nào để viết một câu trả lời tốt? . Cảm ơn
sɐunıɔ ןɐ qɐp
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.