#javascript #jquery #html
#javascript #jquery #HTML
Вопрос:
Я пытаюсь разработать модуль, в котором я хотел бы показать предварительный просмотр изображения пользователю, прежде чем он загрузит изображение в базу данных.
Я нашел решение, которое работает для Firefox, но не работает для IE и Chrome…Кто-нибудь может мне помочь.
Вот мой код:-
function imageURL(input) {
if (input.files amp;amp; input.files[0]) {
var reader = new FileReader();
reader.onload = function(e) {
$('#replaceMe').attr('src', e.target.result)
.width(100)
.height(100);
}
reader.readAsDataURL(input.files[0]);
}
}
И я вызываю эту функцию при изменении события элемента управления вводом файла:-
<input type="file" class="file" onchange="imageURL(this)" />
А также я пробовал этот URL-адрес, но он не работает для IE7 и 8 и Chrome.
Комментарии:
1. попробуйте добавить файл:/// в начало пути
2. да, если вы открываете изображение в браузере из локального, URL-адрес будет похож на этот файл:///C:/path/image.jpg …. чтобы вы получили путь, просто добавьте file:/// в начале……
3. единственный известный мне способ сделать это — я видел, как это делалось раньше, — запустить Java-апплет на клиенте. Затем у него есть разрешения на локальные ресурсы — они могут просматривать, выбирать, удалять и т.д. — обрезать, редактировать, эффекты.. Затем в апплете отправьте запрос туда, куда вам нужно загрузить, если они довольны. Я думаю, Facebook или Picasa использовали этот подход несколько лет назад — но это также было главным образом для сжатия изображений на клиенте перед отправкой .. та же разница..
Ответ №1:
Не существует кроссплатформенного способа добиться этого, используя только HTML / JavaScript. Однако это возможно, используя очень простой программный подход:
Шаг 1: Привязка к размытию
Привяжите событие «размытия» к вашему полю ввода файла, например:
$("#input_field").blur(function(event){
alert("Blur!");
});
Шаг 2: Создание эскизов на стороне сервера
Вам нужно будет написать небольшое приложение / маршрут в вашем серверном приложении, которое просто принимает форму, содержащуюся во входном файле, и генерирует временный выходной файл. Вы могли бы даже просто временно сохранить filedata в своей базе данных, а не записывать отдельные файлы на диск; реализация зависит от вас. Когда этот маршрут получает запрос, он должен уменьшать изображение, а затем возвращать путь к этому уменьшенному изображению
Шаг 3: AJAX
Сначала выберите одну из многих доступных библиотек jQuery «AJAX Upload», чтобы форма, содержащая ваш файл, загружала его через AJAX. Примените эту библиотеку к форме (для приведенных ниже примеров я буду использовать ajaxForm.), а затем измените размытие:
// AJAX the form
$("#your_form").ajaxForm({
success: function(response){
// Insert your returned thumbnail into your DOM.
}
});
// Modify the blur
$("#input_field").blur(function(event){
$("#input_field").closest("form").submit();
});
Проблемы:
При описанном выше подходе возникнут проблемы. Создание вашей формы AJAX будет означать, что ее регулярная отправка будет прерываться — не говоря уже о том, что маршрут миниатюр будет отличаться от фактического маршрута отправки формы. Используйте некоторые обходные пути (например, создайте вторичную скрытую форму, и событие размытия скопирует файл-загрузите в него, а затем отправит его).
Комментарии:
1. Да, это правильный ответ на вопрос, но, как вы упомянули, он сломается и вызовет разочарование. Каким-либо образом операционная система пытается выполнить то, что уже есть в Windows — просмотры миниатюр малого / среднего / большого размера, которые отображаются в форме OpenDialog Windows, которая поддерживает выбор нескольких файлов. Он заново изобретает колесо. Хороший ответ!
2. Можете ли вы немного доработать свое решение, поскольку я новичок в этом кодировании на стороне клиента.
3. То, что предлагает @Mike, на самом деле относится как к стороне сервера, так и к стороне клиента — этот метод загружает изображения перед отображением эскизов.
Ответ №2:
Это не будет работать ни в одном другом браузере, кроме firefox, потому что используемый вами объект FileReader не является стандартом js, это класс, очень специфичный для FireFox. Согласно веб-стандарту браузерные скрипты (javascript) не будут иметь разрешения безопасности на чтение содержимого любых системных ресурсов (файлов).
В IE вы можете попытаться получить доступ к содержимому файловой системы с помощью ActiveXObject (FileSystemObject).
Комментарии:
1. Я не уверен, потому что я никогда этого не пробовал. Всегда будет лучше не идти против установленных стандартов. Тем не менее, если вы хотите это сделать, вам придется использовать разные обработчики для каждого браузера, который вы хотите поддерживать. Поддерживать эти изменения в течение более длительного периода времени и с выходом новых различных браузеров и версий браузеров станет настоящим кошмаром.
Ответ №3:
Нет никакого кроссбраузерного решения (даже для FileReader
использования в Firefox требуются определенные разрешения), только некоторые обходные пути для ie и firefox.
Вы должны поступить обычным способом, загрузить изображение во временный файл и удалить / сохранить его в зависимости от подтверждения пользователя
Надеюсь, это поможет
Комментарии:
1. 1 Спасибо, Эдгар!! Я пытаюсь выяснить, почему нам нужна эта функциональность!!
Ответ №4:
Согласно, Когда я смогу использовать …, файловый API поддерживается в Firefox 3.6 , Chrome 9 , Opera 11.1 (и Safari 6).
Если вам действительно нужно это в IE, вы можете захотеть создать средство загрузки файлов во Flash.
Комментарии:
1. 1 за то, что подсказал мне, когда я могу использовать сайт, большое спасибо, друг
2. Safari 6? текущая версия 5.1.7
3. @Vitim.us На момент моего ответа, caniuse.com указано, что Safari 6.0 (следующая крупная версия Safari, известная на тот момент) поддерживает File API. На данный момент версии 5.1 и 5.2 (ближайшие версии) указаны как имеющие частичную поддержку (отсутствует поддержка FileReader).
4. На мгновение я подумал, что мой Safari устарел
Ответ №5:
Я согласен с теми, кто уже ответил отрицательно — локальные файлы запрещены по дизайну.
Но, если вы действительно привержены этой функции предварительного просмотра перед загрузкой и готовы включить некоторый неровный пользовательский интерфейс, вы можете обойти вопрос о локальном сервере и…
… используйте сопутствующее приложение AIR для обработки загрузки изображений для вашего веб-приложения.
-
Создайте простое приложение AIR, которое позволит пользователям выбирать локальные изображения и отображать их в виде эскизов без их загрузки.
-
Вы можете проверить, установлено ли у пользователя приложение, после чего вы можете предложить им установить или запустить его, если оно уже установлено (подробнее об этом смотрите здесь).). Вы могли бы разрешить им отказаться и использовать резервную систему загрузки без предварительного просмотра эскизов.
-
После выбора и просмотра изображений (или даже изменения размера или иной обработки) приложение AIR может напрямую загружать их на ваш сервер.
Я знаю, это безумие и, вероятно, не соответствует вашим навыкам или ожиданиям (на основе тегов в этом вопросе), но я думаю, что это сработало бы.
Ответ №6:
Попробуйте это для IE < 10:
<style type="text/css">
#imgPreview {
width:320px;
height:280px;
filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod=scale);
}
</style>
<h2>Preview images for MS-IE amp;< 10</h2>
<form id="form1" runat="server">
<input type="file" onchange='document.getElementById("imgPreview").filters.item("DXImageTransform.Microsoft.AlphaImageLoader").src=this.value' />
<div id="imgPreview"></div>
</form>
Скрипта:http://jsfiddle.net/Sme2L/5 /
Ответ №7:
Используйте jQuery ajax для решения вашей проблемы.
$.ajax({
type: "post",
url: "serverURL?randomParam=" (Math.random() * 1000),
cache: false,
data: null,
success: function(json){
try{
var obj = JSON.parse(json);
if(obj[0].IMAGE!=null){
$("#captchaImage").attr("src", obj[0].IMAGE);
}
}catch(e) {
showMessage("E1");
}
},
error: function(){
}
});
Комментарии:
1. если это решило вашу проблему, вам нужно принять этот ответ