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

Я хочу иметь возможность предварительного просмотра файла (изображения) перед его загрузкой. Действие предварительного просмотра должно выполняться в браузере без использования Ajax для загрузки изображения.

Как я могу это сделать?

Ответы [ 18 ]

2265 голосов
/ 16 декабря 2010

Пожалуйста, ознакомьтесь с примером кода ниже:

function readURL(input) {
  if (input.files && input.files[0]) {
    var reader = new FileReader();
    
    reader.onload = function(e) {
      $('#blah').attr('src', e.target.result);
    }
    
    reader.readAsDataURL(input.files[0]);
  }
}

$("#imgInp").change(function() {
  readURL(this);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form runat="server">
  <input type='file' id="imgInp" />
  <img id="blah" src="#" alt="your image" />
</form>

Кроме того, вы можете попробовать этот образец здесь .

282 голосов
/ 27 ноября 2014

Есть несколько способов сделать это. Наиболее эффективным способом будет использование URL.createObjectURL () в файле из вашего . Передайте этот URL-адрес img.src , чтобы сообщить браузеру загрузить предоставленное изображение.

Вот пример:

<input type="file" accept="image/*" onchange="loadFile(event)">
<img id="output"/>
<script>
  var loadFile = function(event) {
    var output = document.getElementById('output');
    output.src = URL.createObjectURL(event.target.files[0]);
  };
</script>

Вы также можете использовать FileReader.readAsDataURL () , чтобы проанализировать файл из . Это создаст строку в памяти, содержащую представление base64 изображения.

<input type="file" accept="image/*" onchange="loadFile(event)">
<img id="output"/>
<script>
  var loadFile = function(event) {
    var reader = new FileReader();
    reader.onload = function(){
      var output = document.getElementById('output');
      output.src = reader.result;
    };
    reader.readAsDataURL(event.target.files[0]);
  };
</script>
175 голосов
/ 18 ноября 2014

Однострочное решение:

В следующем коде для просмотра больших изображений используются URL-адреса объектов, которые намного эффективнее, чем URL-адреса данных (URL-адрес данных - это огромная строка, содержащая все данные файла, тогда как URL-адрес объекта - это просто короткая строка, ссылающаяся на файл данные в памяти):

<img id="blah" alt="your image" width="100" height="100" />

<input type="file" 
    onchange="document.getElementById('blah').src = window.URL.createObjectURL(this.files[0])">

Сгенерированный URL будет выглядеть так:

blob:http%3A//localhost/7514bc74-65d4-4cf0-a0df-3de016824345
45 голосов
/ 24 декабря 2011

Ответ LeassTaTT хорошо работает в «стандартных» браузерах, таких как FF и Chrome.Решение для IE существует, но выглядит иначе.Вот описание кросс-браузерного решения:

В HTML нам нужны два элемента предварительного просмотра: img для стандартных браузеров и div для IE

HTML:

<img id="preview" 
     src="" 
     alt="" 
     style="display:none; max-width: 160px; max-height: 120px; border: none;"/>

<div id="preview_ie"></div>

В CSSукажите следующую специфическую для IE вещь:

CSS:

#preview_ie {
  FILTER: progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod=scale)
}  

В HTML мы включаем стандартные и специфичные для IE JavaScript:

<script type="text/javascript">
  {% include "pic_preview.js" %}
</script>  
<!--[if gte IE 7]> 
<script type="text/javascript">
  {% include "pic_preview_ie.js" %}
</script>

pic_preview.js - это Javascript из ответа LeassTaTT.Замените $('#blah') на $('#preview') и добавьте $('#preview').show()

Теперь специфичный для IE Javascript (pic_preview_ie.js):

function readURL (imgFile) {    
  var newPreview = document.getElementById('preview_ie');
  newPreview.filters.item('DXImageTransform.Microsoft.AlphaImageLoader').src = imgFile.value;
  newPreview.style.width = '160px';
  newPreview.style.height = '120px';
}    

То естьРаботает в IE7, IE8, FF и Chrome.Пожалуйста, проверьте IE9 и сообщите.Идея предварительного просмотра IE была найдена здесь: http://forums.asp.net/t/1320559.aspx

http://msdn.microsoft.com/en-us/library/ms532969(v=vs.85).aspx

23 голосов
/ 05 июня 2014

Я отредактировал @ Иван ответ, чтобы отобразить изображение "Нет предварительного просмотра", если это не изображение:

function readURL(input) {
    var url = input.value;
    var ext = url.substring(url.lastIndexOf('.') + 1).toLowerCase();
    if (input.files && input.files[0]&& (ext == "gif" || ext == "png" || ext == "jpeg" || ext == "jpg")) {
        var reader = new FileReader();

        reader.onload = function (e) {
            $('.imagepreview').attr('src', e.target.result);
        }

        reader.readAsDataURL(input.files[0]);
    }else{
         $('.imagepreview').attr('src', '/assets/no_preview.png');
    }
}
18 голосов
/ 14 декабря 2015

Вот версия несколько файлов , основанная на ответе Ивана Баева.

HTML

<input type="file" multiple id="gallery-photo-add">
<div class="gallery"></div>

JavaScript / jQuery

$(function() {
    // Multiple images preview in browser
    var imagesPreview = function(input, placeToInsertImagePreview) {

        if (input.files) {
            var filesAmount = input.files.length;

            for (i = 0; i < filesAmount; i++) {
                var reader = new FileReader();

                reader.onload = function(event) {
                    $($.parseHTML('<img>')).attr('src', event.target.result).appendTo(placeToInsertImagePreview);
                }

                reader.readAsDataURL(input.files[i]);
            }
        }

    };

    $('#gallery-photo-add').on('change', function() {
        imagesPreview(this, 'div.gallery');
    });
});

Требуется jQuery 1.8 из-за использования $ .parseHTML, который должен помочь в смягчении последствий XSS.

Это будет работать из коробки, и единственная зависимость, которую вынужен jQuery.

16 голосов
/ 25 июля 2014

Да.Это возможно.

HTML

<input type="file" accept="image/*"  onchange="showMyImage(this)" />
 <br/>
<img id="thumbnil" style="width:20%; margin-top:10px;"  src="" alt="image"/>

JS

 function showMyImage(fileInput) {
        var files = fileInput.files;
        for (var i = 0; i < files.length; i++) {           
            var file = files[i];
            var imageType = /image.*/;     
            if (!file.type.match(imageType)) {
                continue;
            }           
            var img=document.getElementById("thumbnil");            
            img.file = file;    
            var reader = new FileReader();
            reader.onload = (function(aImg) { 
                return function(e) { 
                    aImg.src = e.target.result; 
                }; 
            })(img);
            reader.readAsDataURL(file);
        }    
    }

Вы можете получить Live Demo здесь.

10 голосов
/ 30 ноября 2016

Чисто и просто JSfiddle

Это будет полезно, если вы хотите, чтобы событие инициировалось косвенно с помощью div или кнопки.

<img id="image-preview"  style="height:100px; width:100px;"  src="" >

<input style="display:none" id="input-image-hidden" onchange="document.getElementById('image-preview').src = window.URL.createObjectURL(this.files[0])" type="file" accept="image/jpeg, image/png">

<button  onclick="HandleBrowseClick('input-image-hidden');" >UPLOAD IMAGE</button>


<script type="text/javascript">
function HandleBrowseClick(hidden_input_image)
{
    var fileinputElement = document.getElementById(hidden_input_image);
    fileinputElement.click();
}     
</script>
7 голосов
/ 26 ноября 2015

Пример с несколькими изображениями с использованием JavaScript (jQuery) и HTML5

JavaScript (jQuery)

function readURL(input) {
     for(var i =0; i< input.files.length; i++){
         if (input.files[i]) {
            var reader = new FileReader();

            reader.onload = function (e) {
               var img = $('<img id="dynamic">');
               img.attr('src', e.target.result);
               img.appendTo('#form1');  
            }
            reader.readAsDataURL(input.files[i]);
           }
        }
    }

    $("#imgUpload").change(function(){
        readURL(this);
    });
}

Разметка (HTML)

<form id="form1" runat="server">
    <input type="file" id="imgUpload" multiple/>
</form>
5 голосов
/ 21 марта 2014

Как насчет создания функции, которая загружает файл и запускает пользовательское событие. Затем присоедините слушателя к входу. Таким образом, у нас больше гибкости в использовании файла, а не только для предварительного просмотра изображений.

/**
 * @param {domElement} input - The input element
 * @param {string} typeData - The type of data to be return in the event object. 
 */
function loadFileFromInput(input,typeData) {
    var reader,
        fileLoadedEvent,
        files = input.files;

    if (files && files[0]) {
        reader = new FileReader();

        reader.onload = function (e) {
            fileLoadedEvent = new CustomEvent('fileLoaded',{
                detail:{
                    data:reader.result,
                    file:files[0]  
                },
                bubbles:true,
                cancelable:true
            });
            input.dispatchEvent(fileLoadedEvent);
        }
        switch(typeData) {
            case 'arraybuffer':
                reader.readAsArrayBuffer(files[0]);
                break;
            case 'dataurl':
                reader.readAsDataURL(files[0]);
                break;
            case 'binarystring':
                reader.readAsBinaryString(files[0]);
                break;
            case 'text':
                reader.readAsText(files[0]);
                break;
        }
    }
}
function fileHandler (e) {
    var data = e.detail.data,
        fileInfo = e.detail.file;

    img.src = data;
}
var input = document.getElementById('inputId'),
    img = document.getElementById('imgId');

input.onchange = function (e) {
    loadFileFromInput(e.target,'dataurl');
};

input.addEventListener('fileLoaded',fileHandler)

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

...