Pull to refresh

Comments 105

Я наивный, думал, что кроме FancyUpload ничего нету. Спасибо за обзор.
Всё как раньше, при попытке загрузить большие файлы браузер виснет, только что проверил в лисички 3.5 и хроме под линухой, оба браузера повисле при нажатии аплоад, а файл грузил не больше, всего 49 метров…
Так что годиться только только для фоток (и то не очень больших), а прочих мелких файликов =(
хотя не заметил, что вы написали что виснет браузер, php.ini тут видимо не при делах
тестил загрузку больше ста фоток (2.5мб в среднем) отлично справляется

Там в дефолтовой поставке идет скрипт на проверку размера и формата совместимости — уверен проблема была в нем (у себя переделал его сразу)
Прошу прощения, пересмотрел конф — просто отключил проверку на лимит размера закачки.
Я заметил, что браузер виснет во время выгрузки файлов. После выгрузки развисает.
это не только для больших, для маленьких тоже, просто маленькие у тебя видимо очень уж быстро грузятся
Использую FancyUpload — отлично загружаются файлы размером до 3 мб (больше не требуется, хотя автор плагина писал что загружал и 2 GB). Правда технически загружаю по одному файлу за одно соединение, а не все файлы за раз (а то непонятно какие лимиты установить на размер входящих данных и на время работы скрипта...)
Подвисаний нет.
Но, сталкивался с конфликтом с антивирусом касперского. Вопрос решился обновлением антивируса до 10 версии и настройкой в нем сайта, на которорый осуществляется аплоад, как доверенного.
И не забываем о баге с кукис и http authentication ето касается всех браузеров кроме експлорера.
А так, скрипт весьма неплохой.
Есть такое. У меня тоже повис FF 3.5
Меня всегда прикалывают плагины на десятки килобайт, являющимися обертками вокруг 10 строчек, состоящими на половину из перетасовывания настроек.
ну, лично для меня плагин весом в 7кб js + 22 флэш загрузчик — не так уж и критично, если он облегчает жизнь :)
к сожалению 90% сторонних плагинов к jquery обвешены не нужным для меня функционалом(так же как и большинство других плагинов, хоть в той же symfony), что негативно сказывается как на размере и скорости работы так и на стабильности, так что для себя разработал следующую схему: разбираюсь как работает плагин, потом переписываю, минимализируя под свои задачи. В итоге, согласен с Wott, килобайты заменяются десятками строк.
Каждый выбирает для себя, что ему важнее — производительность приложения, либо скорость разработки этого приложения. Всё зависит от поставленной задачи. Думаю, в большинстве случаев лишние 50-100 Кб на страницу сайта — это не критично (с учетом быстрорастущей ширины каналов пользователей) в сравнении с экономией времени затраченного на разработку.
применительно конкретно к этому плагину, смотрим коментарии, какие ошибки и какие трудности возникают, я намного быстрее перепишу и переделаю его с нуля, чем буду в этих килобайтах копаться и выискивать баги, которые к тому же возможно индивидуальны :)
А никто не знает flash-загрузчик, который кроме загрузки еще картинки пережимает на клиенте? Можно и платный.
Готового такого не знаю. Но не сильно сложно сделать это и с этим плагином. Благо исходник есть)
если мне память не изменяет, то у флеша есть ограничения по работе с локальными файлами с диска пользователя. так что может оказаться, что предварительный ресайз невозможен без предварительной закачки на сервер. но могу врать :)
UFO just landed and posted this here
У никто не видел толковый open source загрузчик на java?
у вконтакта скомуниздь, мультизагрузка и пережим-жим картинок %)
Собрался и написал свой аплоадер под google gears, unobtrusive-аналог загрузчика вконтакте, картинки пережимает, превью показывает, файлы загружает, обычную отправку форм эмулирует — не нужно делать никаких изменений на стороне сервера, есть хелперы для интеграции с django-вскими formset'ами.

Пока документация не готова, но мне нравится, что получается. Пока в качестве preview кину сюда ссылку на него, вдруг кому пригодится. Лицензия MIT, так что если кому интересно — используйте, подключайтесь к разработке. Пиар проведу, так сказать, предварительный.

bitbucket.org/kmike/gearsuploader/wiki/ru
Использую этот загрузчик в ЦМС что пишу на codeigniter.
В самом Uploadify было несколько неприятных глюков, но после последнего апдейта (был в конце лета) почти все хорошо за исключением:
1. Иногда улетает окно выбора файлов если долго искать что выбрать(ФФ+Open Suse 11.1) — возможно проблемы с самим ГТК.
2. Окно выбора файлов не запоминает последнюю директорию, иногда просто не удобно рыскать по попкам (опять же не тестил в вин, в лине возможно проблемы с ГТК).
Одно что не совсем хорошо — в флешке некорректно отображается русский (думаю можно подпилить напильником в флеше)

1) под win ff 3.5.3 пока такого не замечал.
2) опять же, у меня всё запомнило :) вин. ff 3.5.3

пысы: про попки особенно понравилось ;)))
Я задолбался воевать с глюками Uploadify и его сочленения с CI, тупо перешёл на SWFUpload, чему и рад вполне (-:
Не подскажите, как вы решили проблему автоматический созданий сессии в CI и то, что SWFUpload создает свою id сессии при передачи?

На данный момент у нас решено только принудильной подачей своей id сессии как дублирующей :(
А как обстоят дела с загрузкой файлов с кириллическими именами?
У меня получилось загрузить только .jpg, и то, имя оказалось пустым.
В файле upload.php добавил в строку А-Я:

$valid_chars_regex = 'А-Я.A-Z0-9_ !@#$%^&()+={}\[\]\',~`-';

Получилось хотя бы избегать пустоты, вместо имени файла.
Ага, у меня те же проблемы на сусе 11.1.
Интересный плагин, буду использовать в своих проектах.
Плагин может сообщать количество переданной информации клиенту без скриптов со стороны сервера?
да, вполне :)

почитайте на сайте про onAllComplete .
Если не разберетесь — сделаем примерчик :)
A function that triggers when all file uploads have completed. There is no default event handler.

Вы, судя по всему, меня немного не правильно поняли — о количестве переданной информации во время передачи, т.е. чтобы был прогресс загрузки. Сейчас у меня получается видеть только финиш загрузки, без каких-либо промежуточных данных.
хм, а прогрессбар у вас не срабатывает? И какая промежуточная информация вам еще нужна?
Как понимаю, помимо прогресс бара вы хотите добавить отображения количества загруженных байт?
ну есть и такая функция, onProgress называется :) опять же, почитайте про неё на офф. сайте.
Думаю это то, что вам нужно :)
ну, это браузер должен делать. Хром делает, кстати.
Но, сколько уже версий браузеров прошло, но ни Opera, ни Firefox этому не научились.
А сам прогресс загрузки реализовал без использования этого модуля — понял силу jQuery.
Есть бага: при загрузке изображений или файлов некоторых, правда у меня не получается локализировать проблему и хоть как-нибудь понять от чего это зависит, плагин загрузив файл на сервак возвращает ошибку — мол никак, не получилось, ты уж прости. Просто редкие файлы грузит, но по окончанию выдаёт что-то вроде: IO Error — 1.zip — 100%, как итог — файл не загрузился.
Это бага видимо во флеше. Если интернет через прокси, с аутентификацией, то плагин, скорее всего работать не будет.
Пробовал другие плагины — ситуация аналогичная.
Поэтому, необходимо оставлять возможность стандартного аплоада через html.

По плагину: недавно внедрил на свой сайт — интерфейс красивый, но есть глючки в старых версиях плагина. Причем примеры идут со старыми, нерабочими версиями, что вносит путаницу, и нет дебагера, позволяющего понять что происходит. В итоге отлаживал скрипты в swfupload (там есть дебагер), а потом подменил его на uploadify. Так же есть нюанс — скрипт аплоада должен быть в отдельной библиотеке или в отдельном блоке script (об этом написано на форуме плагина, пока нашел в чём дело — голову сломал). Вобщем внедрить сложно, но заставить работать — можно.

Посмотреть плагин в действии можно тут:
mp3tter.com
Ещё, помогает понимание того, как эта штука работает. Реально, файлы загружаются не в указанную директорию, а во флешку!111. Через файлгетконтекст какой-то. И только потом, тело файла передается постом — скрипту, указанному в настройках. Соответственно, просто указать максимальный размер файла — недостаточно.

Проверь эти настройки в php.ini:
; Maximum size of POST data that PHP will accept.
post_max_size = 20M
; Whether to allow HTTP file uploads.
file_uploads = On
; Maximum allowed size for uploaded files.
upload_max_filesize = 20M

Для сервера nginx — в секции http также необходимо указать:
keepalive_timeout 0;//!!!
client_max_body_size 20m;//
И разрешить обработку флеша, у меня в конфиге это реализовано так:
if (-f $request_filename) {
expires max;
break;
}

if ($request_filename !~ (js|css|ico|gif|jpg|m3u|swf|zip|png|images|robots\.txt|my_index_file\.php*) ) {
rewrite ^/(.*)$ /mp3tter.php/$1 last;
}
не совсем точно описал:
1. файл загружается во флешку
2. файл сохраняется из флеш в темповую директорию сервера
3. скрипту передается массив $_FILES содержащий имена загруженных файлов
как то так.
вы уже наверное давно локализировали проблему, но для остальных, кто попадет сюда из поиска.

оказывается, у меня проблема была в самом флеше под линукс. он не хотел авторизироваться с помощью http-basic.в винде он спрашивает диалог авторизации, в моей убунте — просто игнорит и выдает ошибку.

буду копать, чтобы обойти эту хрень
Есть еще одна проблема: ошибка I/O Error возникает при работает с доменами.рф
Плагин для вашего любимого jquery.

Я думаю я относился бы к вашему любимому jquery если бы не было так много людей что без него ничего не могут сделать на жаваскрипте.
А почему вы решили что они на jquery могут что-то сделать? Использовать плагины- это одно, а писать самому с использованием фреймворка -это немного другое, имхо, тут тоже необходимо неплохое знание жабаскрипт. И почему бы не любить фреймворк за удобство и функциональность?

Я ЛЮБЛЮ JQUERY больше чем PROTOTYPE :)
Зачем делать что-то на чистом жабоскрипте? Чистый нужен только тогда, когда надо очень мало написать. По онклику скрыть див.
А если писать что-то серьёзное без фреймворка — это уже велосипед (:
А у всех ли файл попадает в директорию uploads?
Даже скрипт с примером этого не делает у меня.
Файл при аплоаде изначально попадает во временную директорию, определенную в настройках php.ini (см. секцию «File Uploads» и в ней upload_tmp_dir)
А оттуда php-командой move_uploaded_file можно его переместить куда требуется.
Есть параметр настройки folder — там задается путь куда грузить
попробуй при инициализации плагина добавить параметр folder: 'uploads'
Столкнулся с некоторыми «багами» при использовании этого плагина:
1. Если на клиентской стороне работает Касперский, то загрузка каждого файла (прогрессбар) сразу показывает 100%. При отключеном касперском — нормально.
2. (хотя тут возможно виноват сервер) Загрузка больших файлов (около 500Мб) доходит до 100% и все, никаких действий от скрипта вы не дождетесь, возникает ощущение, что скрипт ждет json, но не получает и ожидание это может продолжаться вечно!
IO Error — бывает, но не часто…
выше написал как оно работает. Сначала файл загружается во флеш, и только потом сохраняется на сервер. Т.е. в момент, когда градусник показывает 100% — начинается сохранение файла. Просто подождите пока файл сохранится.
Настройте в касперском сайт, на который аплоадите файл, как довернный. Правда такую настройку удалось обнаружить только для KAV 10, в девятом ее не нашел…
(Настройка/Защита/Вэб антивирус/Настройка/Оптимизация проверки/кнопка Выбрать/ добавьте сюда записть типа *yoursite.com*), и все будет работать.
Спасибо, как настроить я знаю, да и проблема с прогрессбаром меня не напрягает, но есть начальство которому не нравится такая визуализация процесса загрузки, вот и думал, мало ли кто то находил решение этой проблемы…
Это все потому, что касперский любые файлы и письма, отправляемые во внешний инет, сразу «закачивает» на себя, говоря приложению, что все в порядке. Дальше сканит и уже после проверки доставляет адресату. Вот потому у браузера и возникает ощущение, что файл загружен: касперский ему так говорит. Установлено опытным путем, могу ошибаться.
Возможно баг — параметр buttonText не принимает utf-8, например, вместо русского текста — цифры.
И еще — возможна ли передача текущей пользовательской сессии?
Так получается, что скрипт просто отсылает данные на сервер независимо от браузера.
Дополнительные параметры можно передавать через контейнер scriptdata, примерно так:
function startUpload()
{
var twitt = 'false';
if (document.getElementById('twitt_it').checked == true) twitt = 'true';
$('#uploadify').uploadifySettings('scriptData',{'tag':$('#tag').val(),'msg':$('#msg').val(),'twitt_it':twitt,'author':'recoilme'});
$('#uploadify').uploadifyUpload();
}
Но эти данные будут переданы как GET, а как сделать, что бы передавалось как POST?

Бывает нужно вместе с файлом передать, порядка 64К текста.
это уже видимо проблема во флеше, нужно его расчленять и разбираться.
существует ли возможность как-то ограничить количество загружаемых файлов при множественной (Multiple) загрузке
simUploadLimit, если в очереди больше файлов — то придется после загрузки количества, равного simUploadLimit нажать еще раз кнопку начала загрузки.
Достаточно непредсказуемая вещь… Если загружать ~30 файлов за раз, то некоторые вылетают с HTTPError. Это не всегда и не поддаётся систематизации =(
Есть еще момент — всегда отдавайте хоть что-то в response сервера, иначе не будут работать события onComplete/onAllComplete.
Единственный неприятный момент в использовании флеша для загрузки файлов — необходимость передавать идентификатор сессии в открытом виде.
Т.е. оно, конечно, не сильно смертельно, если речь идёт об админке — куда доступ одного человека разрешён, другое дело когда это сервис, где толпа народу, имеющая право что-то загружать. Вот тогда уже не так всё кучеряво хотя терпимо.
Кстати, если стоит суровый скрипт (у меня в CakePHP всё сурьёзно) — следует ещё и проверку UserAgent отключать — ибо сессия сессией, а агент-то меняется :)

Спасибо за плагин
Как побороть айди сессии при загрузке файлов? есть ли способ его менять на нужный мне?
Передавать нужный id сессии через параметр.
через параметр где? в скрипте или в пхп?
Да действительно очень полезный плагин, но если кто подскажет как его прикрутить к фреймворку, а точнее как должен выглядеть метод контроллера, которому передается массив с файлами. Много мучился привязать его к CI, но ничего не получилось.
Вот как сделав у себя (/system/application/modules/upload/ — тут сам плагин и нужные файлы):
Настройка плагина (думаю спокойно можно вынести в отдельный js, но не пробывал)

$(document).ready(function() {

$('#fileUpload').fileUpload({
'uploader': '/system/application/modules/upload/uploader.swf',
'script': '/system/application/modules/upload/upload.php',
'folder': '/assets/images/tmp',
'cancelImg': '/system/application/modules/upload/cancel.png',
'multi': true,
'buttonText': 'select files',
'displayData': 'percentage',
'simUploadLimit': 1,
'fileExt': '*.jpg;*.jpeg;*.gif;*.png',
onAllComplete: function(event, data){
$("#loadTips").append(«Файлов загружено: „+data.filesUploaded+“
»);
$("#loadTips").append(«Ошибок: „+data.errors+“
»);
$("#loadTips").append(«Загружено: „+data.allBytesLoaded+“ байт
»);
},
onComplete: function(event, queueID, fileObj, response, data){

idResp=''; // нужно для моего обработчика резалта онАджаксКомплит
$.post('http://<?=$_SERVER['SERVER_NAME']?>/admin/upload/doupload/', 'name='+fileObj.name+'&path='+fileObj.filePath+'&module=<?=$module;?>&id_pos=<?=$id_pos;?>&conf_name=<?=$conf_name?>', // после загрузки делаем запрос на обработчик (ниже будет пример)
function(data){
idResp = ''; // нужно для моего обработчика резалта онАджаксКомплит
$.get('http://<?=$_SERVER['SERVER_NAME']?>/admin/upload/index/'+data+'/', '',
function(data){
$("#gallery_box").fadeIn(250, function() { $("#gallery_box").append(data)}); /* сюда попадают сразу загруженные изображения */
}
);
});
},

onError: function(event, queueID, fileD, errorObj){
$("#loadTips").append(«event: „+event+“
»);
$("#loadTips").append(«queueID: „+queueID+“
»);
$("#loadTips").append(«fileD: „+fileD+“
»);
$("#loadTips").append(«errorObj.status: „+errorObj.status+“
»);
$("#loadTips").append(«errorObj.text: „+errorObj.text+“
»);

}
});

метод что используется после загрузки /admin/upload/doupload/

function doupload(){
$data['name'] = $this->input->post('name');
$data['path'] = $this->input->post('path');

/* тут любая обработка уже загруженных изображений в folder: /assets/images/tmp у меня — зум, первоначальная обработка, запись в БД… */

}

Думаю этого достаточно. Сам плагин подключается в контроллеры через плагин галереи (сделан по аналогии как делать плагин подключения FCK едитора)
Парсер маленько попаскудил код, но думаю суть понятная :)
Вот бы к этому плагину прикрутить форму по удалению уже загруженных или загрузку новых файлов вместо уже имеющихся.
я у себя и прикрутил :) в чём сложность? это уже вопрос даже не к плагину :)
да, плагин тут ни причем, просто пока не придумал как это реализовать
Поправьте в примере: в «checkscript», «script» должен быть с большой буквы: checkScript.
Я долго думал, почему же оно у меня не работает :)

А «folder» как-то не понятно рабоает, все равно добавляет путь к скрипту, хотя в доке и написано: For absolute paths prefix the path with either '/' or 'http'.
хотя, как бы я не правил, хабра менять checkscript на checkscript О_о
хаброглюк, круто-круто =)
а в описании тоже не даёт?
Вопрос, как в файле настроек поменять скажем локализацию Uploadify, не затрагивая основной плагин (в данном случае jquery.uploadify.v2.1.0.min.js), дабы безболезненно в дальнейшем обновлятся.
Или скажем поменять внешний динамически создаваемых вид элементов аплоадера (тот-же програесс бар, когда одинм css не обойтись)?

<script type=«text/javascript»>
jQuery(document).ready(function() {
jQuery("#uploadify").uploadify({
'uploader': '/flash/uploadify.swf',
'script': '/test.php',
'cancelImg': '/img/admin/cancel.png',
'queueID': 'fileQueue',
'auto': true,
'multi': false,
'method': 'GET',
'scriptAccess': 'always',
'fileDesc': 'Audio (*.mp3)',
'fileExt': '*.mp3',
'onError': function(event,queueID,fileObj,errorObj) { },
'onComplete': function(event,queueID,fileObj,response,data) { }
});
});
</script>

лог апача пишет следующее:

«POST /test.php?folder=%2Fmusic%2F&fileext=%2A%2Emp3 HTTP/1.1» 302 207 "-" «Shockwave Flash» 24188 4

и ещё странная штука. флешка 2 раза вызывает test.php в начале загрузки и в конце.
А как хэндлить ошибки?
Тоесть, если у меня произошла ошибка на стадии, например, копирования файла из временной директории в директорию назначения — как сообщить об этом в скрипт, отправивший файл?

Там в примере uploadify.php в конце есть строкаи

echo '1';
и
echo 'Invalid file type.';

Но как их ловить — непонятно, onError не вызывается, в onAllComplete тоже errors: 0… куда рыть?
2 fog:
Нет решения по поводу того, как хендлить ошибки?
Если честно, я уже не помню как я тогда разобрался :)
Вот ответ,
Я когда задавал вопрос — невнимательно прочитал пример

'onComplete': function (event, queueID, fileObj, response, data) {$('#response').append (response);}
Думаю, стоит об этом сказать, но на текущий момент плагин некорректно работает. Возможно, дело в более новой версии jQuery. Но факт остается фактом. upladifySettings вызывает ошибку. Потратил много времени на изоляцию проблемы, и бросил в пользу SWFUpload.
и я
у swf upload даже примеры понятнее и приятнее
Ага, только я оказался таким ветреным, что через 5 месяцев подсел на другую библиотеку, лишенную флеша — Ajax Upload.
По крайней мере нет никаких проблем с изоляцией авторизации, подгрузкой и стилизацией аплоадера. Просто нет. И библиотека в целом весяг в 3 раза меньше SWFUpload.
эх, один минус. Как я понял, если использовать сторонний класс для заливки файла (class.upload), то прогресс-бара не будет :(
Это не минус. Это обязательное условие. Хотя в принципе, у вас есть возможность самому написать хэндлер загрузки, который будет обрабатывать прогресс загрузки.
Не получилось почему-то, никак не хочет прогресс бар показывать.
Плюс не нашёл, как ограничить количество загружаемых файлов
Sign up to leave a comment.

Articles