Показать предварительный просмотр изображения перед загрузкой

117

В моей HTML-форме я ввел файл типа, например:

 <input type="file" multiple>

Затем я выбираю несколько файлов, нажимая эту кнопку ввода. Теперь я хочу показать предварительный просмотр выбранных изображений перед отправкой формы. Как это сделать в HTML 5?

Хардик Сондагар
источник
То же самое для одного изображения: stackoverflow.com/questions/4459379/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Ответы:

265

HTML5 поставляется со спецификацией File API , которая позволяет создавать приложения, позволяющие пользователю взаимодействовать с файлами локально; Это означает, что вы можете загружать файлы и отображать их в браузере, не загружая файлы. Частью File API является интерфейс FileReader, который позволяет веб-приложениям асинхронно читать содержимое файлов.

Вот краткий пример, который использует FileReaderкласс для чтения изображения как DataURL и визуализирует миниатюру, установив параметрsrc атрибут тега изображения на URL-адрес данных:

HTML-код:

<input type="file" id="files" />
<img id="image" />

Код JavaScript:

document.getElementById("files").onchange = function () {
    var reader = new FileReader();

    reader.onload = function (e) {
        // get loaded data and render thumbnail.
        document.getElementById("image").src = e.target.result;
    };

    // read the image file as a data URL.
    reader.readAsDataURL(this.files[0]);
};

Вот хорошая статья об использовании файловых API в JavaScript .

Фрагмент кода в примере HTML ниже отфильтровывает изображения из выбранных пользователем и отображает выбранные файлы в несколько эскизов:

Камьяр Назери
источник
2
Как отменить загрузку некоторых изображений, а затем отправить форму? Мне это действительно поможет.
Hardik Sondagar
Но я хочу знать, как удалить конкретный файл, чтобы предотвратить его загрузку. Это определено в какой-то структуре.
Hardik Sondagar
4
Просто отключите элемент ввода файла, и он не будет загружен! Итак, в приведенном выше примере:document.getElementById("uploadImage").disabled = true
Камьяр Назери
@KamyarNazeri Если FileReader недоступен, как насчет этого?
MichaelLuthor
1
@Nicholas Фрагмент кода в разделе «Показать фрагмент» на самом деле позволяет загружать несколько изображений и просматривать их все
Камьяр Назери,
20

Здесь я сделал с jQuery, используя FileReader API.

Разметка HTML:

<input id="fileUpload" type="file" multiple />
<div id="image-holder"></div>

JQuery:

Здесь, в коде jQuery, сначала я проверяю расширение файла. т.е. допустимый файл изображения для обработки, затем проверит, поддерживает ли браузер FileReader API, а затем обрабатывается только в противном случае отобразить уважаемое сообщение

$("#fileUpload").on('change', function () {

     //Get count of selected files
     var countFiles = $(this)[0].files.length;

     var imgPath = $(this)[0].value;
     var extn = imgPath.substring(imgPath.lastIndexOf('.') + 1).toLowerCase();
     var image_holder = $("#image-holder");
     image_holder.empty();

     if (extn == "gif" || extn == "png" || extn == "jpg" || extn == "jpeg") {
         if (typeof (FileReader) != "undefined") {

             //loop for each file selected for uploaded.
             for (var i = 0; i < countFiles; i++) {

                 var reader = new FileReader();
                 reader.onload = function (e) {
                     $("<img />", {
                         "src": e.target.result,
                             "class": "thumb-image"
                     }).appendTo(image_holder);
                 }

                 image_holder.show();
                 reader.readAsDataURL($(this)[0].files[i]);
             }

         } else {
             alert("This browser does not support FileReader.");
         }
     } else {
         alert("Pls select only images");
     }
 });

Подробная статья: как просмотреть изображение перед загрузкой, jQuery, HTML5 FileReader () с Live Demo

Сатиндер Сингх
источник
1
разве считать плохой практикой , если вы declear varв for loop? каждый раз for loopитерация новая переменная readerбудет отключена ..
Phoenix,
Добавление accept="image/*"атрибута к <input> может помочь предотвратить выбор типов файлов, не являющихся изображениями.
августа
Как я могу показать имена изображений вместе с предварительным просмотром изображения?
Навинбос,
4

йогеш чатрола
источник
1

Для фоновых изображений обязательно используйте url()

node.backgroundImage = 'url(' + e.target.result + ')';
epicgear
источник