Что такое FileRider()?
FileRider() - метод API HTML5, который используется для чтения локальных файлов. С помощью FileRider() можно создать превью (миниатюру) изображения перед отправкой на сервер, проверить совпадение типа фала с его расширением, ограничить размер загружаемого файла и т.д.
FileRider() поддерживает следующие браузеры:
Состояние дел на текущий момент можно посмотреть здесь: http://caniuse.com/#feat=filereader
HTML форма загрузки изображений
И так приступим. Для начала нам нужно сделать форму загрузки изображений:
<div class="container"> <div class="row"> <label>Загрузить один файл:</label> <input type="file" id="file" name="file" /> </div> <div class="row"> <span id="output"></span> </div> <div class="row"> <label>Мультизагрузка файлов:</label> <input type="file" id="fileMulti" name="fileMulti[]" multiple /> </div> <div class="row"> <span id="outputMulti"></span> </div> </div>
Весь код формы описывать нет смысла. В примере 2 вида загрузки, 1 файл и мультизагрузка.
Код JavaScript для отображения превью изображений перед отправкой на сервер
JavaScript для отображения превью одного файла:
<script> function handleFileSelect(evt) { var file = evt.target.files; // FileList object var f = file[0]; // Only process image files. if (!f.type.match('image.*')) { alert("Image only please...."); } var reader = new FileReader(); // Closure to capture the file information. reader.onload = (function(theFile) { return function(e) { // Render thumbnail. var span = document.createElement('span'); span.innerHTML = ['<img class="thumb" title="', escape(theFile.name), '" src="', e.target.result, '" />'].join(''); document.getElementById('output').insertBefore(span, null); }; })(f); // Read in the image file as a data URL. reader.readAsDataURL(f); } document.getElementById('file').addEventListener('change', handleFileSelect, false); </script>
JavaScript отображения превью для мультизагрузки:
<script> function handleFileSelect(evt) { var file = evt.target.files; // FileList object // Loop through the FileList and render image files as thumbnails. for (var i = 0, f; f = files[i]; i++) { // Only process image files. if (!f.type.match('image.*')) { alert("Image only please...."); } var reader = new FileReader(); // Closure to capture the file information. reader.onload = (function (theFile) { return function (e) { // Render thumbnail. var span = document.createElement('span'); span.innerHTML = ['<img class="thumb" title="', escape(theFile.name), '" src="', e.target.result, '" />'].join(''); document.getElementById('output').insertBefore(span, null); }; })(f); // Read in the image file as a data URL. reader.readAsDataURL(f); } } document.getElementById('file').addEventListener('change', handleFileSelect, false); </script>
Итог
В итоге получим следующее:
Комментарии
мульти пример не работает
ОтветитьПроверила, все работает
ОтветитьУ меня тоже пример не работает
ОтветитьПроверила еще раз, все ок:
Ответитьнужно выбрать сразу несколько файлов, зажимая ctrl и кликая по нужным.
ОтветитьМультипример не работает из-за этой строчки:
Ответитьdocument.getElementById('file').addEventListener('change', handleFileSelect, false);
Нужно поменять на:
document.getElementById('fileMulti').addEventListener('change', handleFileSelectMulti, false);
Спасибо автору. Все работает!
ОтветитьСпасибо! Класс! Всё работает! А не подскажите, как сделать чтобы можно было выбрать например тока 5 фото.
ОтветитьСпасибо!
Может как то так (в handleFileSelect()):
Ответить1. В примере мультизагрузки ошибка, поэтому он и не работает. Там где JavaScript отображения превью для мультизагрузки - в стороке 24 которая выглядит как
Ответитьdocument.getElementById('file').addEventListener('change', handleFileSelect, false);
надо вместо 'file' писать 'fileMulti'
2. Кто-нибудь знает можно ли работать с FileList (менять порядок элементов, удалять элементы)?
FileList это массив, поэтому думаю можно. Документацию смотрели?
ОтветитьСпасибо за помощь! Работает! Но не совсем так как надо. Хотелось, что бы сколько не загружай больше 5 не добавлялось. Спасибо!
ОтветитьНе работает так, оно как бы отсекает превьюшки, но только визуально, в массив для передачи файлов все равно попадают все выбранные файлы...
ОтветитьСпасибо, за хороший пример! =)
ОтветитьВо втором js коде две опечатки. Переменная должна быть files а не file и вывод фотографий должен писаться в outputMulti, а не в output
День добрый!
ОтветитьОтличный пример, но сколько не бьюсь - мультизагрузка на мобильном в Chrome и в Opera не работает :( Падает браузер с ошибкой :(
При этом загрузка одиночной картинки - отлично срабатывает.
все хорошо,но подскажите, как можно сделать так, чтобы в мультизагрузке не перезатирались предыдущие файлы,если выбрать хочу больше 1 раза?
ОтветитьДобрый день....подскажите как можно все выбранные фото отправить на e-mail или на FTP в обозначенную папку! Извиняюсь если вопрос тупой...я только учусь :(
ОтветитьМожно. Форма отправляет на сервер, а там делайте с ними что хотите, хоть по фтп, хоть на почту отправляйте.
ОтветитьСпасибо за ответ....то, что это можно я знаю....вот только как именно на примере этого скрипта...
ОтветитьВот тут https://кодер.укр/%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D0%B8/php-%D0%BE%D1%82%D0%BF%D1%80%D0%B0%D0%B2%D0%BA%D0%B0-%D0%BF%D0%BE%D1%87%D1%82%D1%8B-%D1%87%D0%B5%D1%80%D0%B5%D0%B7-smtp я понимаю как работает форма и куда с формы уходит...а тут не понимаю :(
Мульти вариант капец корявый! Поправьте, чтоли?
ОтветитьА как удалять? Например я передумал какой-либо из изображений отправлять, как его удалить?
Ответить