Как загрузить изображение перед загрузкой через JavaScript

Я хочу просмотреть изображение перед загрузкой на сервер. Я написал для этого немного кода, но его просматривают только в Internet Explorer, а не в других браузерах, таких как Safari, Chrome, Firefox, из-за некоторых причин безопасности. Есть ли какое-либо решение для предварительного просмотра изображения в этих браузерах?

    <body>
       <form name="Upload" enctype="multipart/form-data" method="post">
           Filename: <INPUT type="file" id="submit">
           <INPUT type="button" id="send" value="Upload">
       </form>
       <div 
           id="div" 
           align="center" 
           style="height: 200px;width: 500px;border-style: ridge;border-color: red">
       </div>
    </body>

    <script type="text/javascript">
        var img_id=0
        var image = new Array()
        document.getElementById('send').onclick=function()
        {
            img_id++
            var id="imgid"+img_id
            image = document.getElementById('submit').value;
            document.getElementById('div').innerHTML="<img id='"+id+"' src='"+image+"' width=500px height=200px>"
        }
    </script>
</html>

Ответы

Ответ 1

Для Firefox. Из-за безопасности он имеет усеченный путь. Однако они предоставили другие способы сделать это:

var img = document.createElement("IMG");
if(document.all)
    img.src = document.getElementById('submit').value;
else
    // Your solution for Firefox.
    img.src = document.getElementById('submit').files.item(0).getAsDataURL();
document.getElementById('div').appendChild(img);

Ниже приводится работа в Internet Explorer 7 и Firefox 3.

<style type="text/css">
    #prevImage {
        border: 8px solid #ccc;
        width: 300px;
        height: 200px;
    }
</style>
<script type="text/javascript">
    function setImage(file) {
        if(document.all)
            document.getElementById('prevImage').src = file.value;
        else
            document.getElementById('prevImage').src = file.files.item(0).getAsDataURL();
        if(document.getElementById('prevImage').src.length > 0) 
            document.getElementById('prevImage').style.display = 'block';
    }
</script>
<pre>
     IE8 needs a security settings change: internet settings, security, custom level :

     [] Include local directory path when uploading files to a server
 ( ) Disable
 (o) Enable 
</pre>
<form>
    <input type="file" name="myImage" onchange="setImage(this);" />
</form>
<img id="prevImage" style="display:none;" />

Документация объекта списка файлов в MDC

Ответ 2

Это отлично работает для меня в FF 3.6, IE 8, Safari 4.0 и Chrome 3.195.

Несколько указателей стиля:

  • Не используйте область предварительного просмотра с фиксированной шириной, изображение будет искажено, чтобы соответствовать области.
  • Вместо document.getElementById() используйте это:

    function $(id) { return document.getElementById(id); }

  • Пример: $('send')

Ответ 3

Невозможно захватить файл пользователя перед загрузкой, за исключением использования нового API файлов:

Пример: отображение эскизов выбранных пользователем изображений

Это, конечно, не будет кросс-браузером. Также может быть способ сделать это через Flash и URL-адреса данных (или только предварительный просмотр во Flash), но я предпочитаю избегать интеграции JavaScript ↔ Flash.

Ответ 4

просто взгляните на следующую ссылку, связанную с файловым API, она работает для IE9 + i, она не работает для IE8 он показывает, как просматривать изображения и текстовые файлы http://www.xul.fr/en/html5/filereader.php FileReader, загрузка изображения на веб-странице

FileReader позволяет получить доступ к локальной файловой системе и загружать документы только с помощью кода JavaScript.

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

Тест на совместимость

Текущий браузер распознает его API файлов, который включает в себя объект FileReader?

Результат Поддерживается API файлов. Исходный код теста:

<script>
if (window.File && window.FileReader && window.FileList && window.Blob) 
  document.write("<b>File API supported.</b>");
else
  document.write('<i>File API not supported by this browser.</i>');
</script>   

Код HTML:

<input type="file" id="getimage">

<fieldset><legend>Your image here</legend>
    <div  id="imgstore"></div>
</fieldset> 

Код JavaScript:

<script>
function imageHandler(e2) 
{ 
  var store = document.getElementById('imgstore');
  store.innerHTML='<img src="' + e2.target.result +'">';
}

function loadimage(e1)
{
  var filename = e1.target.files[0]; 
  var fr = new FileReader();
  fr.onload = imageHandler;  
  fr.readAsDataURL(filename); 
}

window.onload=function()
{
  var x = document.getElementById("filebrowsed");
  x.addEventListener('change', readfile, false);
  var y = document.getElementById("getimage");
  y.addEventListener('change', loadimage, false);
}
</script>

Ответ 5

Если тип ввода - это файл, то с помощью функции htmlfilereader можно просмотреть предварительный просмотр html-страницы? используя accept type = "text/html"

Я получил описание и размер файла...

  

<script>
  function handleFileSelect(evt) {
    var files = evt.target.files; // FileList object

    // files is a FileList of File objects. List some properties.
    var output = [];
    for (var i = 0, f; f = files[i]; i++) {
      output.push('<li><strong>', escape(f.name), '</strong> (', f.type || 'n/a', ') - ',
                  f.size, ' bytes, last modified: ',
                  f.lastModifiedDate ? f.lastModifiedDate.toLocaleDateString() : 'n/a',
                  '</li>');
    }
    document.getElementById('list').innerHTML = '<ul>' + output.join('') + '</ul>';
  }

  document.getElementById('files').addEventListener('change', handleFileSelect, false);
</script>

выше упомянутая проблема связана с автономными локальными хранимыми html-страницами. мы можем просмотреть предварительный просмотр живой страницы, используя живой URL-адрес, как -

<html>
    <head>
    <!--[if IE]>
    <style>
    #frame {
        zoom: 0.2;
    }
    </style>
    <![endif]-->
    <style>
    #frame {
        width: 800px;
        height: 520px;
        border: none;
        -moz-transform: scale(0.2);
        -moz-transform-origin: 0 0;
        -o-transform: scale(0.2);
        -o-transform-origin: 0 0;
        -webkit-transform: scale(0.2);
        -webkit-transform-origin: 0 0;
    }
    </style>
    </head>
    <body>
    <iframe id="frame" src="http://www.bing.com">
    </iframe>
    </body>
    </html
<Р →

Ответ 6

Просто попробуйте использовать этот

В вашем файле HTML используйте

<div>
<form id="form1" runat="server">
        <input type='file' id="imgInp" />
        <br>
        <img id="blah" src="http://i.imgur.com/zAyt4lX.jpg" alt="your image" height="100" />
    </form>
<div>

И внутри вашего java script файла просто напишите это

<script>

 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>

Ответ 7

Это отлично работает в FF 3.6, IE 9, Safari 4.0 и Chrome 3.195.

var reader = new FileReader();

function preview(what) {
     if(jQuery.browser.msie || jQuery.browser.safari || jQuery.browser.chrome) {
         document.getElementById("preview-photo").src=what.value;
         return;
    }
    else{                   
        // array with acceptable file types
        var accept = ["image/png","image/jpeg","image/jpg","image/gif"];

        // if we accept the first selected file type
        if (accept.indexOf(what.files[0].type) > -1) {
            if(what.files && what.files[0]){
                  reader.readAsDataURL(what.files[0]);
                  document.getElementById("preview-photo").src=reader.result;
            }
        }       
    }
}