Использование jQuery, ограничение размера файла перед загрузкой

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

Мне было интересно, есть ли ограничение, в котором я могу установить, сколько байтов может пройти через этот поток AJAX до сервера? Это могло позволить мне проверить этот размер файла и вернуть ошибку, если файл слишком большой.

Делая это на стороне клиента, он блокирует тех новичков, которые делают снимок размером 10 МБ со своего Pentax и пытаются его загрузить.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
49
0
145 820
9

Ответы 9

Я не думаю, что это возможно, если вы не используете загрузчик flash, activex или java.

По соображениям безопасности ajax / javascript не разрешен доступ к файловому потоку или свойствам файла до или во время загрузки.

На самом деле это было правдой к тому времени, когда вы написали этот ответ, но теперь у нас есть File API в новой спецификации HTML5 :) stackoverflow.com/a/9106313/429521

Felipe Sabino 02.03.2012 17:51

Я столкнулся с той же проблемой. Вы должны использовать ActiveX или Flash (или Java). Хорошо то, что это не обязательно должно быть агрессивным. У меня есть простой метод ActiveX, который вернет размер загружаемого файла.

Если вы выберете Flash, вы даже можете сделать несколько причудливых js / css для настройки процесса загрузки - только используя Flash (как «фильм» 1x1) для доступа к функциям загрузки файлов.

Кажется, это правильный путь, и я почти уверен, что Flickr использует элемент управления Flash, чтобы предоставить некоторую обратную связь о том, что вы загружаете, если оно слишком велико и что идет.

Tom 27.05.2009 00:52

Мы используем SWFUpload, хотя он и не находится в активной разработке, он оказался довольно удобным и легко интегрируемым.

Purefan 19.10.2011 11:21

Я обнаружил, что 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, вы можете предупредить их еще до того, как они отправят страницу.

EndangeredMassa 21.11.2008 08:03

Как уже говорили другие, это невозможно с использованием только JavaScript из-за такой модели безопасности.

Если вы можете, я бы порекомендовал одно из нижеприведенных решений ... оба из которых используют флэш-компонент для проверки на стороне клиента; однако подключены с помощью Javascript / jQuery. Оба работают очень хорошо и могут использоваться с любыми серверными технологиями.

http://www.uploadify.com/

http://swfupload.org/

Невозможно проверить размер, ширину или высоту изображения на стороне клиента. Вам необходимо загрузить этот файл на сервер и использовать 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, любое понимание приветствуется

Doug Molineux 14.04.2011 00:36

Это копия моих ответов на очень похожий вопрос: Как проверить размер входного файла с помощью 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 :)

Felipe Sabino 28.05.2013 05:30
 $(".jq_fileUploader").change(function () {
    var fileSize = this.files[0];
    var sizeInMb = fileSize.size/1024;
    var sizeLimit= 1024*10;
    if (sizeInMb > sizeLimit) {


    }
    else {


    }
  });

Вопрос довольно старый, у вас есть достаточно времени, чтобы дать хороший описательный ответ, т.е. добавить некоторые пояснения к вашему коду, пожалуйста.

Ilya Luzyanin 09.09.2014 10:32

Я думаю, что это не работает с IE 9, файловый объект не имеет свойства size.

Stiger 02.04.2015 13:34

Попробуйте код ниже:

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;
}

Другие вопросы по теме