Загрузка изображения в <img>из <входного файла> - PullRequest
63 голосов
/ 28 сентября 2010

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

Я добавил обработчик события onchange в элемент ввода следующим образом:

<input type="file" name="picField" id="picField" size="24" onchange="preview_2(this);" alt=""/>

и функция preview_2:

var outImage ="imagenFondo";
function preview_2(what){
    globalPic = new Image();
    globalPic.onload = function() {
        document.getElementById(outImage).src = globalPic.src;
    }
    globalPic.src=what.value;
}

где outImage имеет значение id тега, в который я хочу загрузить новое изображение.

Однако, похоже, что загрузка никогда не происходит, и она ничего не загружает в html.

Что мне делать?

Ответы [ 5 ]

70 голосов
/ 28 сентября 2010

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

Пример

document.getElementById('picField').onchange = function (evt) {
    var tgt = evt.target || window.event.srcElement,
        files = tgt.files;

    // FileReader support
    if (FileReader && files && files.length) {
        var fr = new FileReader();
        fr.onload = function () {
            document.getElementById(outImage).src = fr.result;
        }
        fr.readAsDataURL(files[0]);
    }

    // Not supported
    else {
        // fallback -- perhaps submit the input to an iframe and temporarily store
        // them on the server until the user's session ends.
    }
}

Поддержка браузера

  • IE 10
  • Safari 6.0.2
  • Chrome 7
  • Firefox 3.6
  • Opera 12.02

Там, где File API не поддерживается, вы не можете (в большинстве браузеров, обеспечивающих безопасность) получить полный путь к файлу из поля ввода файла, а также не можете получить доступ к данным.Единственное жизнеспособное решение - отправить форму на скрытый iframe и предварительно загрузить файл на сервер.Затем, когда этот запрос завершится, вы можете установить src изображения в местоположение загруженного файла.

39 голосов
/ 22 апреля 2013

Как сказал iEamin в своем ответе, HTML 5 теперь поддерживает это. Ссылка, которую он дал, http://www.html5rocks.com/en/tutorials/file/dndfiles/, превосходна. Вот минимальный пример, основанный на примерах на этом сайте, но посмотрите этот сайт для более подробных примеров.

Добавьте onchange прослушиватель событий в ваш HTML:

<input type="file" onchange="onFileSelected(event)">

Создайте тег изображения с идентификатором (я указываю height=200, чтобы убедиться, что изображение не слишком большое на экране):

<img id="myimage" height="200">

Вот JavaScript onchange прослушивателя событий. Он берет объект File, который был передан как event.target.files[0], создает FileReader для чтения его содержимого и устанавливает новый прослушиватель событий для назначения результирующего URL data: тегу img:

function onFileSelected(event) {
  var selectedFile = event.target.files[0];
  var reader = new FileReader();

  var imgtag = document.getElementById("myimage");
  imgtag.title = selectedFile.name;

  reader.onload = function(event) {
    imgtag.src = event.target.result;
  };

  reader.readAsDataURL(selectedFile);
}
4 голосов
/ 11 ноября 2017

$('document').ready(function () {
    $("#imgload").change(function () {
        if (this.files && this.files[0]) {
            var reader = new FileReader();
            reader.onload = function (e) {
                $('#imgshow').attr('src', e.target.result);
            }
            reader.readAsDataURL(this.files[0]);
        }
    });
    });
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="file" id="imgload" >
 <img src="#" id="imgshow" align="left">
// это работает для меня в jquery
3 голосов
/ 28 сентября 2010

Andy E правильно, что не существует способа сделать это на основе HTML *;но если вы хотите использовать Flash, вы можете сделать это.Следующее работает надежно на системах, в которых установлена ​​Flash.Если ваше приложение должно работать на iPhone, то, конечно, вам понадобится запасное решение на основе HTML.

* ( Обновление от 22.04.2013: HTML теперь поддерживает это,в HTML5. См. другие ответы.)

Загрузка Flash также имеет и другие преимущества - Flash позволяет отображать индикатор выполнения по мере загрузки большого файла.(Я почти уверен, что именно так Gmail делает это, используя Flash за кулисами, хотя я могу ошибаться в этом.)

Вот пример приложения Flex 4, которое позволяет пользователю выбрать файл,а затем отображает его:

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
               xmlns:s="library://ns.adobe.com/flex/spark" 
               xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600"
               creationComplete="init()">
    <fx:Declarations>
        <!-- Place non-visual elements (e.g., services, value objects) here -->
    </fx:Declarations>
    <s:Button x="10" y="10" label="Choose file..." click="showFilePicker()" />
    <mx:Image id="myImage" x="9" y="44"/>
    <fx:Script>
        <![CDATA[
            private var fr:FileReference = new FileReference();

            // Called when the app starts.
            private function init():void
            {
                // Set up event handlers.
                fr.addEventListener(Event.SELECT, onSelect);
                fr.addEventListener(Event.COMPLETE, onComplete);
            }

            // Called when the user clicks "Choose file..."
            private function showFilePicker():void
            {
                fr.browse();
            }

            // Called when fr.browse() dispatches Event.SELECT to indicate
            // that the user has picked a file.
            private function onSelect(e:Event):void
            {
                fr.load(); // start reading the file
            }

            // Called when fr.load() dispatches Event.COMPLETE to indicate
            // that the file has finished loading.
            private function onComplete(e:Event):void
            {
                myImage.data = fr.data; // load the file's data into the Image
            }
        ]]>
    </fx:Script>
</s:Application>
0 голосов
/ 10 сентября 2018

var outImage ="imagenFondo";
function preview_2(obj)
{
	if (FileReader)
	{
		var reader = new FileReader();
		reader.readAsDataURL(obj.files[0]);
		reader.onload = function (e) {
		var image=new Image();
		image.src=e.target.result;
		image.onload = function () {
			document.getElementById(outImage).src=image.src;
		};
		}
	}
	else
	{
		    // Not supported
	}
}
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>preview photo</title>
</head>

<body>
<form>
	<input type="file" onChange="preview_2(this);"><br>
	<img id="imagenFondo" style="height: 300px;width: 300px;">
</form>
</body>
</html>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...