В PHP у них есть способ ограничить размер файла ПОСЛЕ загрузки, но не ДО загрузки. Я использую Плагин Malsup jQuery Form для публикации формы, и он поддерживает публикацию файлов изображений.
Мне было интересно, есть ли ограничение, в котором я могу установить, сколько байтов может пройти через этот поток AJAX до сервера? Это могло позволить мне проверить этот размер файла и вернуть ошибку, если файл слишком большой.
Делая это на стороне клиента, он блокирует тех новичков, которые делают снимок размером 10 МБ со своего Pentax и пытаются его загрузить.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Я не думаю, что это возможно, если вы не используете загрузчик flash, activex или java.
По соображениям безопасности ajax / javascript не разрешен доступ к файловому потоку или свойствам файла до или во время загрузки.
Я столкнулся с той же проблемой. Вы должны использовать ActiveX или Flash (или Java). Хорошо то, что это не обязательно должно быть агрессивным. У меня есть простой метод ActiveX, который вернет размер загружаемого файла.
Если вы выберете Flash, вы даже можете сделать несколько причудливых js / css для настройки процесса загрузки - только используя Flash (как «фильм» 1x1) для доступа к функциям загрузки файлов.
Кажется, это правильный путь, и я почти уверен, что Flickr использует элемент управления Flash, чтобы предоставить некоторую обратную связь о том, что вы загружаете, если оно слишком велико и что идет.
Мы используем SWFUpload, хотя он и не находится в активной разработке, он оказался довольно удобным и легко интегрируемым.
Я обнаружил, что Apache2 (вы можете также проверить Apache 1.5) имеет способ ограничить это перед загрузкой, поместив это в ваш файл .htaccess:
LimitRequestBody 2097152
Это ограничивает его 2 мегабайтами (2 * 1024 * 1024) при загрузке файла (если я правильно выполнил вычисления с байтами).
Обратите внимание, что когда вы это сделаете, журнал ошибок Apache будет генерировать эту запись, когда вы превысите этот лимит в публикации формы или получите запрос:
Requested content-length of 4000107 is larger than the configured limit of 2097152
И он также отобразит это сообщение в веб-браузере:
<h1>Request Entity Too Large</h1>
Итак, если вы делаете сообщения формы AJAX с чем-то вроде плагина Malsup jQuery Form Plugin, вы можете перехватить ответ H1, подобный этому, и показать результат ошибки.
Между прочим, возвращается номер ошибки 413. Итак, вы можете использовать директиву в вашем файле .htaccess, например ...
Redirect 413 413.html
... и вернуть более изящный результат ошибки.
Да, но пользователь все еще должен дождаться загрузки своего 30-мегабайтного файла, прежде чем он получит сообщение об ошибке. Если вы используете flash / activeX, вы можете предупредить их еще до того, как они отправят страницу.
Как уже говорили другие, это невозможно с использованием только JavaScript из-за такой модели безопасности.
Если вы можете, я бы порекомендовал одно из нижеприведенных решений ... оба из которых используют флэш-компонент для проверки на стороне клиента; однако подключены с помощью Javascript / jQuery. Оба работают очень хорошо и могут использоваться с любыми серверными технологиями.
Невозможно проверить размер, ширину или высоту изображения на стороне клиента. Вам необходимо загрузить этот файл на сервер и использовать PHP для проверки всей этой информации.
PHP имеет специальные функции, такие как: getimagesize()
list($width, $height, $type, $attr) = getimagesize("img/flag.jpg");
echo "<img src=\"img/flag.jpg\" $attr alt=\"getimagesize() example\" />";
Я пробовал это таким образом и получаю результаты в IE *, а Mozilla 3.6.16 не проверял в более старых версиях.
<img id = "myImage" src = "" style = "display:none;"><br>
<button onclick = "findSize();">Image Size</button>
<input type = "file" id = "loadfile" />
<input type = "button" value = "find size" onclick = "findSize()" />
<script type = "text/javascript">
function findSize() {
if ( $.browser.msie ) {
var a = document.getElementById('loadfile').value;
$('#myImage').attr('src',a);
var imgbytes = document.getElementById('myImage').size;
var imgkbytes = Math.round(parseInt(imgbytes)/1024);
alert(imgkbytes+' KB');
}else {
var fileInput = $("#loadfile")[0];
var imgbytes = fileInput.files[0].fileSize; // Size returned in bytes.
var imgkbytes = Math.round(parseInt(imgbytes)/1024);
alert(imgkbytes+' KB');
}
}
</script>
Также добавьте библиотеку JQuery.
Прежде всего, спасибо за код. Во-вторых, у меня есть этот код, расположенный здесь: jsfiddle.net/6ZQkj/2 Он не работает в Chrome, Firefox или Safari на Mac, любое понимание приветствуется
Это копия моих ответов на очень похожий вопрос: Как проверить размер входного файла с помощью jQuery?
На самом деле у вас нет доступа к файловой системе (например, для чтения и записи локальных файлов). Однако из-за спецификации 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, она будет работать только для современных браузеров (для IE требуется v10), и я добавил здесь более подробную информацию и ссылки на другую информацию о файлах, которую вы должны знать: http://felipe.sabino.me/javascript/2012/01/30/javascipt-checking-the-file-size/
Поддержка старых браузеров
Имейте в виду, что старые браузеры возвращают значение null для предыдущего вызова this.files, поэтому доступ к this.files[0] вызовет исключение, и вы должны проверьте поддержку File API перед его использованием.
@ShawnEary, это не уловка, это просто реализация HTML5 File API, которую IE10 действительно поддерживает caniuse.com/#feat=fileapi :)
$(".jq_fileUploader").change(function () {
var fileSize = this.files[0];
var sizeInMb = fileSize.size/1024;
var sizeLimit= 1024*10;
if (sizeInMb > sizeLimit) {
}
else {
}
});
Вопрос довольно старый, у вас есть достаточно времени, чтобы дать хороший описательный ответ, т.е. добавить некоторые пояснения к вашему коду, пожалуйста.
Я думаю, что это не работает с IE 9, файловый объект не имеет свойства size.
Попробуйте код ниже:
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;
}
На самом деле это было правдой к тому времени, когда вы написали этот ответ, но теперь у нас есть File API в новой спецификации HTML5 :) stackoverflow.com/a/9106313/429521