Загрузка изображения из
Я пытаюсь загрузить изображение, выбранное пользователем через элемент.
я добавил обработчик событий 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 имеет значение идентификатора тега, где я хочу, чтобы новое изображение было загружено.
однако, похоже, что onload никогда не происходит, и он ничего не загружает в html.
Что делать?
5 ответов:
в браузерах, поддерживающих 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
где файл API не поддерживается, вы не можете (в большинстве сознательных безопасности браузеры) получить полный путь к файлу в поле ввода файла, и вы не можете получить доступ к данным. Единственным жизнеспособным решением было бы отправить форму в скрытый iframe и предварительно загружен файл на сервер. Затем, когда этот запрос завершится, вы можете установить src изображения в местоположение загруженного файла.
как сказал 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]
, строит aFileReader
чтобы прочитать его содержимое и настроить новый прослушиватель событий для назначения результирующегоdata:
URL to theimg
теги: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); }
$('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]); } }); });
//вот работа для меня в jquery<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">
Andy E правильно, что нет HTML-способ сделать это*; но если вы готовы использовать Flash, вы можете это сделать. Следующее надежно работает на системах, в которых установлена Flash. Если ваше приложение должно работать на iPhone, то, конечно, вам понадобится резервное HTML-решение.
* (4/22/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>
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>