2009-05-28 2 views
16

Чтобы быть более конкретным, я хочу использовать форму с одним или несколькими полями ввода файлов, используемыми для изображений. Когда эти поля будут изменены, я хотел бы показать предварительный просмотр связанного изображения перед отправкой данных на сервер.Можно ли просматривать локальные изображения перед загрузкой их через форму?

Я пробовал несколько подходов к JavaScript, но я всегда сталкивался с ошибками безопасности. Я бы не прочь использовать java или flash, если бы решение было изящно деградировано для тех пользователей, у которых их не было. (Они не будут получать превью, и они тоже не будут раздражать «установить эту вещь».)

Кто-нибудь сделал это простым, многоразовым способом?

P.S. Я знаю, что есть песочница, но песочница должна быть в темной запертой комнате, все окна затушевываются?

+0

Вы не можете просмотреть изображение без загрузки его раньше. Я не знаю, что это можно сделать с помощью Flash, возможно, с Java, но я думаю, что это будет похоже на tryig, чтобы убить муху молотком. Вы можете выполнить некоторую «имитацию» Ajax-загрузки с помощью iframe, в сети есть несколько примеров, и они работают очень хорошо. –

+0

Возможный дубликат [Есть ли способ позволить пользователю просмотреть изображение, которое они собираются загрузить на стороне клиента перед загрузкой на сервер?] (Http://stackoverflow.com/questions/3515965/is-there-a-way -to-let-a-user-view-an-image-they-are-about-to-upload-client-side-b) –

+0

Посмотрите на этот чистый подход к JavaScript, включая его ответ, и там комментарий Ray Nicholus для окончательное решение: http://stackoverflow.com/questions/16430016/using-readasdataurl-for-image-preview –

ответ

0

Here's a jQuery + PHP script для загрузки изображения с его предварительным просмотром.

+0

этот загружает изображение перед его показом. аккуратный код, хотя – Javier

-1

У JavaScript нет доступа к локальной файловой системе в целях безопасности, период.

+0

Это идиотизм безопасности. Такой файл не может быть отправлен на сервер, так что это за? Я видел много веб-игр, которые имеют возможность загружать графики на ваш hdd, поэтому игра работает быстрее. – Thinker

+0

Мыслитель, который обычно выполняется с кешированием HTTP - это совершенно другая вещь. JS по-прежнему не имеет доступа к путям в клиентской файловой системе. –

+1

За исключением того, что теперь есть API файлов HTML5, который дает вам доступ для чтения к загружаемым файлам. И это безопасно –

1

Первым шагом является поиск пути изображения. JavaScript разрешен для опроса элемента управления загрузкой для имени файла/пути, но (по соображениям безопасности) различные браузеры показывают разные вещи движку JS, чем они отображаются пользователю - они, как правило, сохраняют имя файла неповрежденным, поэтому вы можете хотя бы подтвердить его расширение, но вы можете получить c:\fake_path\ или некоторые аналогично обфусканные вещи, добавленные к имени файла. Попытка этого в разных браузерах даст вам представление о том, что возвращается как реальный путь, и что подделано, и где.

На втором этапе отображается изображение. Можно просмотреть локальные изображения, если вы знаете их пути, с помощью img тегов с исходными URL-адресами file://, если браузер пользователя разрешает схему file://. (Firefox по умолчанию не работает.) Поэтому, если вы можете заставить пользователя рассказать вам, какой полный путь к изображению, вы можете, по крайней мере, попытаться загрузить его.

+0

+1 проверено & работает MSIE6,7 – zeroin23

0

Я когда-либо видел Java-апплеты, которые делают это, например, приложение для загрузки изображений на Facebook. Недостатком подхода Java является то, что пользователю будет предложено доверять аплету перед его запуском, что является своего рода раздражением, но это позволяет апплетам представить браузер файлов с предварительным просмотром изображений или делать более интересные вещи, например, позволяет пользователю для загрузки всего каталога.

25

Нет необходимости в причудливых вещах. Все, что вам нужно, это функция createObjectURL, которая создает URL-адрес, который может использоваться как изображение src, и может поступать прямо из локального файла.

Предположим, вы выбрали пару изображений с компьютера пользователя с помощью элемента ввода файла (<input type="file" />). Вот как вы можете создать предварительные просмотры для файлов изображений для него:

function createObjectURL(object) { 
    return (window.URL) ? window.URL.createObjectURL(object) : window.webkitURL.createObjectURL(object); 
} 

function revokeObjectURL(url) { 
    return (window.URL) ? window.URL.revokeObjectURL(url) : window.webkitURL.revokeObjectURL(url); 
} 

function myUploadOnChangeFunction() { 
    if(this.files.length) { 
     for(var i in this.files) { 
      var src = createObjectURL(this.files[i]); 
      var image = new Image(); 
      image.src = src; 
      // Do whatever you want with your image, it's just like any other image 
      // but it displays directly from the user machine, not the server! 
     } 
    } 
} 
+0

Работает, но только в Chrome 18, Chromium 18, Firefox 11. Не работает в Safari, IE 9 и я не проверяли в опере. http://jsfiddle.net/M3kj6/1/ Я буду работать над этим позже, чтобы увидеть, могу ли я заставить его работать в saf & ie. В любом случае его интересный ... :) – 2012-04-17 12:36:12

+1

Это наиболее подходящий способ для этой задачи. В соответствии с этим: https://developer.mozilla.org/en-US/docs/DOM/window.URL.createObjectURL он уже работает в IE 10 и Opera. –

+0

Отличный ответ, спасибо. – whitelionV

0

Вы можете попробовать этот подход, хотя и кажется, что это не работает на IE.

http://saravani.wordpress.com/2012/03/14/preview-of-an-image-before-it-is-uploaded/

Это простой и быстрый код.

Я поставил код здесь только в случае, если источник умирает:

Сценарий:

<!-- Assume jQuery is loaded --> 
    <script> 
     function readURL(input) { 
     if (input.files && input.files[0]) { 
      var reader = new FileReader(); 

      reader.onload = function (e) { 
      $('#img_prev') 
       .attr('src', e.target.result) 
       .width(150) 
       .height(200); 
      }; 

      reader.readAsDataURL(input.files[0]); 
     } 
     } 
    </script> 

В HTML:

<!--[if IE]> 
     <script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script> 
    <![endif]--> 
    </head> 
    <body> 
     <input type='file' onchange="readURL(this);" /> 
     <img id="img_prev" src="#" alt="your image" /> 
    </body> 
Смежные вопросы