Проверка разрешения/размера изображения на стороне клиента

Делаю сайт для типографии. Им нужна программа проверки размера/разрешения изображения, которая позволит их клиентам загружать изображение, которое они хотят напечатать, и сообщит им, достаточно ли разрешение изображения для печати.

Я использую Adobe Muse, поэтому мне нужно простое решение HTML и CSS без каких-либо требований к серверу.

Это то, что у меня есть до сих пор, на основе этот вопрос :

window.URL = window.URL || window.webkitURL;
$("form").submit(function(e) {
    var form = this;
    e.preventDefault(); //Stop the submit for now

   //Replace with your selector to find the file input in your form var
   fileInput = $(this).find("input[type=file]")[0];
   file = fileInput.files && fileInput.files[0];
   if (file) {
       var img = new Image();
       img.src = window.URL.createObjectURL(file);

        img.onload = function() {
            var width = img.naturalWidth, height = img.naturalHeight;
            window.URL.revokeObjectURL( img.src );
            if( width == 400 && height == 300 ) {
                form.submit();
            } else { 
                //stop
            } 
        }; 
    } else {
        //No file was input or browser doesn't support client side reading
        form.submit();
    }
});

Однако я не получаю никаких всплывающих сообщений. Что я делаю неправильно?


person George Gibson    schedule 02.10.2015    source источник
comment
Поэтому у меня не может быть простого кода, который практически говорит, что если изображение меньше 400x400, отобразить этот текст или изображение, но если изображение больше 400x400, отобразить этот текст или изображение?   -  person George Gibson    schedule 02.10.2015
comment
Ну, я нашел этот код, который, кажется, считывает размеры перед загрузкой на сервер, поэтому я предположил, что это возможно? stackoverflow.com/questions/13572129/   -  person George Gibson    schedule 02.10.2015
comment
Я не знал, что это возможно. Я исправляюсь! У вас была конкретная проблема с тем, чтобы этот пример кода работал?   -  person Nate Barbettini    schedule 02.10.2015
comment
Что ж, когда я добавил его в Muse, всплывающее окно с размерами не появилось, как в демо... И мне действительно просто нужно знать, как его закодировать, чтобы, если они загружают изображение, которое или терка, чем 400 X 400 говорит, что вы можете использовать это, а если оно ниже 400 X 400, то говорит, что вы не можете использовать это. Просто не знаете, как это кодировать?   -  person George Gibson    schedule 02.10.2015
comment
Можете ли вы добавить код, который вы пробовали до сих пор?   -  person Nate Barbettini    schedule 03.10.2015
comment
Часть 1: window.URL = window.URL || окно.webkitURL; $(form).submit( function( e ) { var form = this; e.preventDefault(); // Остановить отправку на данный момент // Замените селектором, чтобы найти входной файл в форме var fileInput = $(this ).find(input[type=file])[0], file = fileInput.files && fileInput.files[0]; if( file ) { var img = new Image(); img.src = window.URL.createObjectURL ( файл );   -  person George Gibson    schedule 03.10.2015
comment
Часть 2: img.onload = function() { var width = img.naturalWidth, height = img.naturalHeight; window.URL.revokeObjectURL( img.src ); если (ширина == 400 && высота == 300) { form.submit(); } еще { // стоп } }; } else { // Файл не был введен или браузер не поддерживает чтение на стороне клиента form.submit(); } });   -  person George Gibson    schedule 03.10.2015
comment
Читать код в комментариях невозможно, поэтому я позволил себе добавить его к вашему вопросу. Надеюсь, все в порядке. (К вашему сведению, в будущем используйте функцию «Редактировать», чтобы отредактировать исходный вопрос.)   -  person Nate Barbettini    schedule 03.10.2015
comment
Да, пробовал добавить код, но не позволил? Сделал контроль+К, но все равно не работает... Спасибо!   -  person George Gibson    schedule 03.10.2015


Ответы (1)


Ваш код содержит ряд ошибок, поэтому он не работает. (Я не думаю, что событие submit даже привязано к форме, потому что ваш селектор jQuery выглядит неправильно: он должен быть #form или .form)

Вот рабочее решение:

HTML

<form id="form" action="destination.html">
    <input type="file" id="filePicker" />
    <br/>
    <input type="submit" value="Submit" />
</form>

JS

var _URL = window.URL || window.webkitURL;

function isSupportedBrowser() {
    return window.File && window.FileReader && window.FileList && window.Image;
}

function getSelectedFile() {
    var fileInput = document.getElementById("filePicker");
    var fileIsSelected = fileInput && fileInput.files && fileInput.files[0];
    if (fileIsSelected)
        return fileInput.files[0];
    else
        return false;
}

function isGoodImage(file) {
    var deferred = jQuery.Deferred();
    var image = new Image();

    image.onload = function() {
        // Check if image is bad/invalid
        if (this.width + this.height === 0) {
            this.onerror();
            return;
        }

        // Check the image resolution
        if (this.width >= 400 && this.height >= 400) {
            deferred.resolve(true);
        } else {
            alert("The image resolution is too low.");
            deferred.resolve(false);
        }
    };

    image.onerror = function() {
        alert("Invalid image. Please select an image file.");
        deferred.resolve(false);
    }

    image.src = _URL.createObjectURL(file);

    return deferred.promise();
}


$("#form").submit(function(event) {
    var form = this;

    if (isSupportedBrowser()) {
        event.preventDefault(); //Stop the submit for now

        var file = getSelectedFile();
        if (!file) {
            alert("Please select an image file.");
            return;
        }

        isGoodImage(file).then(function(isGood) {
            if (isGood)
                form.submit();
        });
    }
});

isSupportedBrowser() прежде чем пытаться проверить изображение, убедитесь, что браузер пользователя поддерживает необходимые функции.

getSelectedFile() убеждается, что пользователь выбрал файл, а затем передает данные файла обратно.

isGoodImage() берет данные файла и пытается создать из них элемент изображения. Если onerror запускается, это не изображение или поврежденный файл. Если запущен onload, он выполняет проверку работоспособности, чтобы убедиться, что изображение имеет допустимые размеры, а затем подтверждает, что разрешение выше 400x400.

Поскольку события onerror и onload запускаются асинхронно, функция должна вернуть обещание, указывающее результат проверки.

Наконец, обработчик submit в форме связывает все эти вызовы методов вместе и разрешает отправку формы только в том случае, если проверка разрешения дает положительный результат.

Ссылка на скрипку: http://jsfiddle.net/uwj85m7d/7/

Изменить В соответствии с запросом вариант, который показывает divs, содержащие сообщения об ошибках, вместо всплывающих окон с предупреждениями: http://jsfiddle.net/uwj85m7d/8/


Дальнейшее чтение:

person Nate Barbettini    schedule 03.10.2015
comment
Это просто фантастика! Еще один вопрос... вместо предупреждения и всплывающего сообщения можно ли связать его с веб-страницей? или еще лучше, чтобы изображение появлялось под кнопкой отправки? - person George Gibson; 03.10.2015
comment
@GeorgeGibson Конечно, это просто! Я добавил дополнительный пример показа скрытых div, содержащих сообщение. Вы можете легко расширить это, включив изображения или стили по мере необходимости. Если это помогло, не могли бы вы также проголосовать за ответ? :) - person Nate Barbettini; 03.10.2015
comment
В отредактированной версии я добавил веб-страницу, на которую я хотел, чтобы она ссылалась, если она была правильной, для целей тестирования Google в данный момент, а затем изменил два других на действия, и если файл не был введен, но отправлен, он будет отправлен на Yahoo, и если неправильный файл был отправлен в Bing, но они все хотят просто Google? я тоже что-то не так делаю? (извините за недостаток знаний, все еще учусь в некотором роде...) - person George Gibson; 03.10.2015
comment
на самом деле, когда я просто добавляю пункт назначения веб-сайта в верхнюю часть, он затем переопределяет все остальные параметры и перестает отображать текст и просто переходит прямо к месту назначения для всего, а не просто к правильному размеру изображения .....? - person George Gibson; 03.10.2015
comment
@GeorgeGibson Я не понимаю, что ты пытаешься сделать, извини. Вы пытаетесь перенаправить пользователя в зависимости от проверки изображения вместо отображения сообщения в форме? - person Nate Barbettini; 03.10.2015
comment
Да, если изображение имеет правильные размеры, я бы хотел, чтобы они перешли на страницу x, и если это неправильные размеры, я бы хотел, чтобы пользователь перешел на страницу y, и если их нет ввода файла, когда нажата кнопка отправки, отображается текст с надписью «Нет файла». ввод ... это имеет смысл? Извините за то, что плохо объясняю, поскольку я сказал, что все еще учусь... :) - person George Gibson; 03.10.2015
comment
@GeorgeGibson И вы хотите, чтобы все это происходило, когда форма отправляется с помощью кнопки «Отправить» или раньше? - person Nate Barbettini; 03.10.2015
comment
Через кнопку отправки. Таким образом, они загружают изображение, нажимают «Отправить», затем, если изображение правильного размера, оно переходит на страницу X, если изображение неправильного размера, переходит на страницу Y, и если изображение не было загружено, и они нажимают «Отправить», отображается отсутствие загруженного файла. - person George Gibson; 03.10.2015
comment
@GeorgeGibson Хорошо, должно быть легко. Сделайте правильную страницу формой action и используйте window.location.href = "invalid.html" для перехода на недопустимую страницу вместо $("#imageValidationError").show();. - person Nate Barbettini; 03.10.2015
comment
хорошо, поэтому я изменил $(#imageValidationError).show(); на window.location.href = invalid.html, но я не понимаю, что вы имеете в виду, говоря о том, что правильная страница является действием формы? - person George Gibson; 03.10.2015
comment
@GeorgeGibson action="destination.html" означает, что форма при отправке будет перенаправлена ​​на destination.html. Измените это на то, что вы хотите, чтобы ваше перенаправление успеха было. - person Nate Barbettini; 04.10.2015
comment
Я сделал это, как мне изменить его, чтобы при загрузке изображения ниже выбранного разрешения оно ссылалось на другую страницу? Поскольку window.location.href = invalid.htmlthing не работает.... - person George Gibson; 04.10.2015
comment
Я понимаю, что action=destination.html я просто не понимаю, как, если клиент загружает изображение размером 300x300, а минимальный размер изображения составляет 400x400, как связать его с другой страницей? @NateBarbettini - person George Gibson; 04.10.2015
comment
@GeorgeGibson window.location.href работает у меня в образце. Не уверен, почему это не работает для вас. Проверьте наличие ошибок в консоли Javascript (F12) или отправьте код в скрипке. - person Nate Barbettini; 04.10.2015
comment
Должен ли я изменить идентификатор? И прочее в HTML? - person George Gibson; 04.10.2015
comment
@GeorgeGibson Нет, ничего, кроме вышеупомянутой строки JS. - person Nate Barbettini; 04.10.2015
comment
Нужно ли добавлять адрес ссылки туда, где написано invalid.html? - person George Gibson; 04.10.2015
comment
Хорошо, сейчас меня нет рядом с компьютером, поэтому я попробую завтра и посмотрю, что говорит скрипка и т. Д. Спасибо за всю вашу помощь! Вы были потрясающими и спасли мне жизнь во многом! Я дам вам знать, как я получаю завтра тоже! - person George Gibson; 04.10.2015
comment
Хорошо, я попробовал то, что вы сказали, и это все еще не работает? вот ссылка на то, что я сделал... jsfiddle.net/uwj85m7d/8/# &togetherjs=ltFNLVD5м3 - person George Gibson; 04.10.2015
comment
@GeorgeGibson Это идентично моему примеру ...? Что вы пробовали? - person Nate Barbettini; 05.10.2015