Загрузка изображений в редактор, без подключения файлового менеджера

Added by Алексей forlord almost 2 years ago

Дорогие друзья, нужна Ваша помощь. Помогите решить вот такую проблемку.
Загрузка изображений в редактор, без подключения файлового менеджера


Replies (29)

RE: Загрузка изображений в редактор, без подключения файлового менеджера - Added by Troex Nevelin almost 2 years ago

Проще всего такую задачу решить написав маленький файловый менеджер который эмулирует загрузку и возвращает нам URL картинки. В любом случае вам потребуется серверная часть (upload скрипт), которой у elRTE нет.

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

RE: Загрузка изображений в редактор, без подключения файлового менеджера - Added by Troex Nevelin almost 2 years ago

Итак заменяем файловый менеджер на простую upload форму без перезагрузки страницы:

 1 $('#myupload').dialog({
 2   autoOpen: false
 3 });
 4 
 5 var opts = {
 6   lang     : 'ru',
 7   height   : 350,
 8   cssfiles : ['elrte/css/elrte-inner.css'],
 9   fmOpen : function(callback) {
10     $('#myupload').dialog('open');
11     var $iframe = $('<iframe name="upload_target"></iframe>');
12     var iframe = $iframe[0];
13     $iframe.hide();
14     $iframe.appendTo($('#file_upload_form'));
15     $('#file').change(function() {
16       $('#file_upload_form').submit();
17     });
18     $('#file_upload_form').attr('target', $iframe.attr('name'));
19     $('#file_upload_form').submit(function() {
20       $iframe.bind('load', function() {
21         $iframe.unbind('load');
22         var doc = iframe.contentWindow ? iframe.contentWindow.document : iframe.contentDocument ? iframe.contentDocument : iframe.document;
23         html = $(doc.body).html();
24         var data = window.JSON && window.JSON.parse ? window.JSON.parse(html) : (new Function("return " + html))();
25         if (data.success) {
26           callback(data.file_name);
27           $('#myupload').dialog('close');
28         }
29         else if (data.failure) {
30           alert("Upload Failed: " + data.failure);
31         }
32       });
33     });
34     $('#file').click();
35   }
36 }
37 var rte = jQuery('#editor').elrte(opts);

Далее вставляем в html форму для загрузки (можно вообщем её сгенерировать и на лету из js):

1 <div id="myupload" title="Upload file">
2     <form id="file_upload_form" enctype="multipart/form-data" action="upload.php" method="POST">
3         <input id="file" name="file" type="file" /><br />
4         <input type="submit" value="Upload" />
5     </form>
6 </div>

Краткий пример того, что upload.php возвращает javascript клиенку:

 1 list($name, $result) = upload('file', 'image_uploads', 'jpg,jpeg,gif,png');
 2 if ($name) { // Upload Successful
 3     $path = "image_uploads/".$name;
 4     echo json_encode(array(
 5         "success"       =>    true,
 6         "file_name"     =>    $path    // Path of the file - JS should get this value
 7     ));
 8 } else { // Upload failed for some reason.
 9     echo json_encode(array(
10         "success"       =>    false,
11         "failure"       =>    $result
12     ));
13 }

upload.php можете лепить свой какой хотите, главное чтобы возвращал json как указано в примере.

P.S.: тестировалось в FireFox и Chrome

elrte.src.html (13 kB)

upload.php (3.1 kB)

RE: Загрузка изображений в редактор, без подключения файлового менеджера - Added by Dmitry Levashov almost 2 years ago

Не будет работать в опере. Опера она такая опера - она не может получить доступ к содержимому ифрейма сразу после его загрузки

RE: Загрузка изображений в редактор, без подключения файлового менеджера - Added by Troex Nevelin almost 2 years ago

Dmitry Levashov wrote:

Не будет работать в опере. Опера она такая опера - она не может получить доступ к содержимому ифрейма сразу после его загрузки

Это да, кажется относиться только к нескольким версиям, просто из-за оперы этот код возрастёт раза в полтора, а пример хочеться оставить более ясным.

В FireFox почему-то не срабатывает 34 строка $('#file_upload_form input#file').click(); может кто скажет почему?

RE: Загрузка изображений в редактор, без подключения файлового менеджера - Added by Dmitry Levashov almost 2 years ago

в коде так и написано #file_upload_form input#file без пробела?
нет необходимости при поиске по id указывать путь от родителя #file - достаточно

RE: Загрузка изображений в редактор, без подключения файлового менеджера - Added by Troex Nevelin almost 2 years ago

Dmitry Levashov wrote:

в коде так и написано #file_upload_form input#file без пробела? нет необходимости при поиске по id указывать путь от родителя #file - достаточно

поправил, но .click() так и не заработал

RE: Загрузка изображений в редактор, без подключения файлового менеджера - Added by Troex Nevelin almost 2 years ago

Я кстати на рассказал как это будет выглядеть, будет это работать вот так:

Сама кнопка файлового менеджера на панеле не будет иметь смысла в данном случае, её можно убрать от туда.

Загрузка работает, в FF автоматом просто не открывается дилог выбора файла для загрузки.

А что именно не заработало поднобнее, какой browser?

RE: Загрузка изображений в редактор, без подключения файлового менеджера - Added by Николай С over 1 year ago

Добрый вечер.

Что-то у меня не получается. Помогите разобраться.
Диалог открывается, файл загружается(в папке я его вижу). Но потом диалоговое окно автоматически не закрывается и путь не передается в поле "URL". Что не так?

RE: Загрузка изображений в редактор, без подключения файлового менеджера - Added by Николай С over 1 year ago

Поставил фаербаг и о чудо - все заработало. Как выключаю фаербаг - опять не работает. Что за мистика?

RE: Загрузка изображений в редактор, без подключения файлового менеджера - Added by Dmitry Levashov over 1 year ago

Диагноз: наличие вызова window.console.log
Причины: вероятно, разгильдяйство разработчиков
Лечение: хирургическое - найти и удалить :)

RE: Загрузка изображений в редактор, без подключения файлового менеджера - Added by Troex Nevelin over 1 year ago

действительно, закоментируйте строку window.console.log(data);

пример писáлся на коленке =)

RE: Загрузка изображений в редактор, без подключения файлового менеджера - Added by Василий Ильин over 1 year ago

Здравствуйте !
нажимаю upload если нет файла то сообщение No file specified появляется иначе нечего не происходит.
фаирбаг ругается на эту строку

var data = window.JSON && window.JSON.parse ? window.JSON.parse(html) : (new Function("return " + html))();

эту строку закоментировал.
window.console.log(data);

RE: Загрузка изображений в редактор, без подключения файлового менеджера - Added by Василий Ильин over 1 year ago

а так я подключаю

        <link rel="stylesheet" href="http://elrte.org/style/style.css"    type="text/css" media="screen" charset="utf-8" />
        <link rel="stylesheet" href="http://elrte.org/release/elrte/css/smoothness/jquery-ui-1.8.7.custom.css" type="text/css" media="screen" charset="utf-8" /> 
        <link rel="stylesheet" href="http://elrte.org/release/elrte/css/elrte.min.css"  type="text/css" media="screen" charset="utf-8" />

        <link rel="stylesheet" href="http://elrte.org/release/elfinder/css/elfinder.css" type="text/css" media="screen" charset="utf-8" />
        <script src="http://elrte.org/release/elrte/js/jquery-1.4.4.min.js"          type="text/javascript" charset="utf-8"></script>
        <script src="http://elrte.org/style/jquery.backgroundPosition.js" type="text/javascript" charset="utf-8"></script>

        <script src="http://elrte.org/release/elrte/js/jquery-ui-1.8.7.custom.min.js" type="text/javascript" charset="utf-8"></script>
        <script src="http://elrte.org/release/elrte/js/elrte.min.js"                  type="text/javascript" charset="utf-8"></script>
        <script src="http://elrte.org/release/elrte/js/i18n/elrte.en.js"          type="text/javascript" charset="utf-8"></script>

        <script src="http://elrte.org/release/elfinder/js/elfinder.min.js"            type="text/javascript" charset="utf-8"></script>
        <script src="http://elrte.org/release/elfinder/js/i18n/elfinder.en.js"    type="text/javascript" charset="utf-8"></script>

        <script type="text/javascript" charset="utf-8">
        jQuery().ready(function() {

            $('#myupload').dialog({
                autoOpen: false
            });

            var opts = {
                cssClass : 'el-rte',
                absoluteURLs: false,
                lang     : 'ru',
                height   : 350,
                cssfiles : ['css/elrte-inner.css'],
                fmOpen : function(callback) {
                    $('#myupload').dialog('open');
                    var $iframe = $('<iframe name="upload_target"></iframe>');
                    var iframe = $iframe[0];
                    $iframe.hide();
                    $iframe.appendTo($('#file_upload_form'));
                    $('#file_upload_form input#file').change(function() {
                        $('#file_upload_form').submit();
                    });
                    $('#file_upload_form').attr('target', $iframe.attr('name'));
                    $('#file_upload_form').submit(function() {
                        $iframe.bind('load', function() {
                            $iframe.unbind('load');
                            var doc = iframe.contentWindow ? iframe.contentWindow.document : iframe.contentDocument ? iframe.contentDocument : iframe.document;
                            html = $(doc.body).html();
                            var data = window.JSON && window.JSON.parse ? window.JSON.parse(html) : (new Function("return " + html))();
                            //window.console.log(data);
                            if (data.success) {
                                callback(data.file_name);
                                $('#myupload').dialog('close');
                            }
                            else if (data.failure) {
                                alert("Upload Failed: " + data.failure);
                            }
                        });
                    });
                    $('#file_upload_form input#file').click();
                }
            }
            var rte = jQuery('#editor').elrte(opts);
        })

        </script>

RE: Загрузка изображений в редактор, без подключения файлового менеджера - Added by Troex Nevelin over 1 year ago

1. Не нужно подключать elrte и elfinder с нашего сервера! мы не CDN чтобы раздавать контент и тем более в скором будущем этих файлов может не быть там =)

2. По вашей проблеме, отследите ошибку в FireBug. Данный код был написан, как пример, а не как готовое рабочее решение и тестировался только в Firefox и Chrome

RE: Загрузка изображений в редактор, без подключения файлового менеджера - Added by Василий Ильин over 1 year ago

По первому пункту, извините, подключал только ради проверки с localhost...
2) Жаль что код не готовое рабочие решение ... задумка очень класная в замен elfinder'a для пых.ера
браузером пользуюсь Firefox 3.6.13

RE: Загрузка изображений в редактор, без подключения файлового менеджера - Added by Василий Ильин over 1 year ago

Спасибо !!!
Всё работает просто нужно было прочитать фаирбаг,
не работало из-за того что дерикторию не создал....
пойду руки выпряМлять
ещё раз спасибо за данный код!)

RE: Загрузка изображений в редактор, без подключения файлового менеджера - Added by Vladimir Shapovalov 12 months ago

Поробовал сделать на основе этого примера форму для загрузки изображений или вставки уже имеющихся (отображаются под формой загрузки в том же диалоговом окошке). Все работает прекрасно, в диалоговое окно вставки картинок урлы пересылаются прекрасно. Но потом обратил внимание что в самом редакторе появилась новая кнопка - с папочкой. По ней вызывается моё окошко загрузки (то есть по сути генерируется событие fmOpen), однако чтобы я не делал, в сам редактор ничего не вставляется. Как я понимаю, при выборе файла, теоретически, ссылка на него должна вставляться в редактор, но этого не происходит. Сделал в своём диалоговом окне alert(callback). Колбеки присылаются разные. Но тот что генерится из окошка редактирование картинок работает, тот что из самого редактора - впустую. Что не так? Хотелось бы, раз уж есть фича, так чтоб работала, тем более что вставка ссылок на файл (для всяких архивов например) пригодилась бы.

RE: Загрузка изображений в редактор, без подключения файлового менеджера - Added by Troex Nevelin 12 months ago

Получается на fmOpen вы повесили своё событие?

Если появилась кнопочка с файловым менеджерм и ты по ней кликните запуститься fmOpen но callback не отработает, так как он не знает куда и как передать url, вообще эта кнопка была сделана именно для нашей cms системы, чтобы просто независимо от редактора запускать файловый менеджер - и всё.

Чтобы не смущать вас и возможно ваших пользователей можно просто убрать кнопку с toolbar панели, ибо в вашем варианте от неё почти нет смысла.

Callback вызывает только из диалога вставки картинки и media

RE: Загрузка изображений в редактор, без подключения файлового менеджера - Added by Vladimir Shapovalov 12 months ago

Что значит не знает? А колбек зачем?

И тем не менее? Что тогда делает elfinder? Пересылает урл в другом виде? делает какие то другие дополнительные манипуляции? Ведь Callback функция присылается, не пустая, но ничего не происходит при её вызове. Для вставки ссылок на прикрепленные к странице файлы я сделал снизу под редактором их список, чтобы пользователь переносил их драгиндропом. Что из этого вышло читайте в соседней теме - короче драгиндроп ни к чему не привел. Потому единственный выход - вставлять линк на файл через диалоговое окно, как это было в моем старом редакторе WysiwygPro. Там было диалоговое окно для картинок, и диалоговое окно для аттачей, с иконкой pdf файла. В данном случае я это представлял именно так - щелк на иконке с "папкой", выбрал файл, ссылка на него вставилась в редакторе. Я даже был удивлен что это не заработало. Было бы очень хорошо если бы это всетаки можно было реализовать - избавило бы от кучи проблем.

RE: Загрузка изображений в редактор, без подключения файлового менеджера - Added by Troex Nevelin 12 months ago

Ну вот так вот странно вышло, что когда с панели запускаешь elFinder он не запускает callback. По идеи вы конечно правы и сам callback elRTE должен определять что за линк ему дали и соответствующе его вставть. Если это окажется не сложно попробуем реализовать в версии 1.x (у нас готовиться релиз). Надо подумать какие могут быть варианты:
  • выбрали картинку (jpg|png|gif) - создаём <img>
  • если это swf - <object>
  • в остальных случаях создаеём - <a href="URL">somefile.pdf</a> - то есть в качестве ссылки используем имя файла, но тут может быть трудоность если пользователь захочет ввести "Загрузить" - ему для этого придётся удалить весь текст и с ним же удалиться сама ссылка. Или же вызывать ещё один dialog и спрашивать текст для ссылки?

RE: Загрузка изображений в редактор, без подключения файлового менеджера - Added by Vladimir Shapovalov 12 months ago

Не, просто третий вариант, ведь вставка картинок и флеша диалоги уже у вас есть. Просто ссылка на файл. А ссылку можно отредактировать уже опосля соответсвующим диалогом, если ему нужны глупые слова "тут", "загрузить" и прочее. Или, если позволит движок/время, сделать колбек функцию с опциональными параметрами:

callback(url,text='',title=''); // Урл, текст в теге A, аттрибут title в теге A. Текст по дефолту потом принимается = урлу, титл по дефолту просто пуст.

(Вообще, как сам веб-девелопер, я не люблю подобное, и избегаю этого, ведь поисковики эти слова в ссылках тоже анализируют. Только название файла или, в крайнем случае, его полное точное описание. Для обычных прикрепленных файлов обычно не нужно.)

В принципе, тогда есть уже и без того три варианта вставки -

1 кнопка с папкой - вставка ссылки на файл, без разницы какого типа. Ссылки на картинки тоже бывают, особенно больших размеров (сканы, карты, прочее).
2 кнопка вставки картинки.
3 кнопка вставки swf.

Так что всё у вас уже есть. И как это должно выглядеть, пользователь выбирает, просто выбирая соответсвующее диалоговое окно, нажимая на кнопки в редакторе. Главное, что бы девелопер мог реализовать fmOpen диалог, основываясь на своих потребностях, и прицепить его к редактору, зная что организует легко и быстро всю манипуляцию с файлами.

У меня например, инфа о файлах хранится в базе, за каждой страницей хранится список прикрепленных только к ней файлов, а сами файлы хранятся хешами с ссылками вида "/files/fa/34/fa345cd6a8943a09". Тут самое оно, это написать просто своё окно открытия файла. Ведь больше нчиего и не требуется. Переделывать elFinder, чтобы заставить его уметь видеть файлы "из базы" - это стрелять из пушки по воробьям. Прочто хочу чтоб ссылка из моего окошка вставлялась.

08.06-1.jpg - тащу файл в редактор. вставиться неправильно (90.3 kB)

08.06-2.jpg - тащу в исходник. правильно, но сие не ссылка и спереди домен добавляется (54.9 kB)

08.06-3.jpg - после кнопки "с папкой". ничего не происходит (46.7 kB)

08.06-4.jpg - диалог вставки картинки. ВСЕ ИДЕАЛЬНО (29.8 kB)

RE: Загрузка изображений в редактор, без подключения файлового менеджера - Added by Vladimir Shapovalov 12 months ago

ХМ. Глянул только что у вас в демо - все аналогично. Нажав кнопку с папкой, вызвал ElFinder, выбрал файл/картинку. Если выбрана одна или по двойному клику вызывается первый пункт в контекстном меню - "Select". Файндер закрывается,.... в редакторе пусто. Видать ваш файндер тоже вызывает колбек функцию, а редактору побоку? Я это понимаю так - юзер выбрал файл, файндер закрылся, в текст вставилась ссылка. Надо картинка - открыл файндер через диалог вставки картинок, отредактировал Title, нажал ОК. Типа так. Точнее, второе рабоатет, первое, просто вставка ссылки, нет.

1 2 Next » (1-25/29)