Как стать автором
Обновить

Комментарии 98

А что, файл нельзя отправить?
Так, а вот по этому поводу у меня есть следующая статья про, опять же, самописный jQuery плагин, служащий для ajax-upload`а файлов. Пока что анонс — для его работы не требуется Flash, только jquery + php. Если сервер поддерживает функцию uploadprogress_get_info, то включается и progress bar. Если функция отстутсвует в Вашей сборки, прогресс загрузки файла не будет отображаться.
В скором будущем — обязательно напишу о нем.
Может лучше не flash, а iframe?
Так я и говорю, что "для его работы не требуется Flash". То есть совсем ) Загрузчик как раз на iframe и работает )
Интересно, на многих shared-хотингах поддерживается uploadprogress_get_info? Я, например, про такую функцию первый раз слышу. Ведь вся прелесть данного загрузчика именно в прогресс-баре.
А Flash частенько глючит и тормозит на линухах. Я так с ним намаялся на убунте, что решил, что такую проблему легче один раз решить на сервере, чем маяться с несовместимостью у каждого клиента.
uploadprogress_get_info — очень редко, где есть, да и работает эта функция ТОЛЬКО на РНР 5.3
uploadprogress обображает прогресс для всех файлов сразу. А решение на flash'е может показать прогресс по каждому файлу и в целом.
Нет, не для всех. Ему методом POST передается уникальный идентификатор аплоада, и показывается статистика только по этой загрузке.
ок. У меня есть форма и количество прикрепляемых файлов может варьироваться. Хочу видеть статистику/прогресс загрузки по каждому из файлов и в целом.
Сорри, не прочел с первого раза «и в целом». Да, так, конечно, не получится.
Updated: загрузчик файлов добавлен )
И правда, как дела с type=«file»?
Ответ выше )
Не, ну правильно же? Если делать — то до конца!!!
Просто эйфория и желание скорее запостить первый топик ) Прошу извинить ;) Исправимся.
Да ничё, я тоже чудил!!! ))
Не забываем про существование замечательного плагин jQuery Form ( jquery.malsup.com/form/ ), который поддерживает асинхронную закачку файлов и прочие вкусности.
Обязательно ознакомлюсь с ним ) Но сразу могу сказать, что uploader там не такой вкусный )
да при загрузке фалов был баг в опера 10, пробовал на версии jquery.form 2.28, файлы больше 1,5 мб не загружались или грузились через раз, а если загружал изображения и ещё их резал, то 100% обрубало загрузку, во всех остальных браузерах всё схватывало отлично
Получение всех данных из формы — $(«id»).serialize()
Да, с этой функцией знаком, но соль в том, что хотелось получать объект, и как-то манипулировать им перед отправкой на сервер.
serializeArray() возвращает массив объектов {name:'email',value:'xxx@xxx.xxx'}. Перебрать его в объект нужного вида не должно составлять труда. И манипулируйте на здоровье.
И эту функцию тоже видел ) Но хотелось все же просто ключ: значения. В целом, конечно, на вкус и цвет )
Тоже не так давно писал загрузчик/сабмиттер форм ( bitbucket.org/kmike/gearsuploader/ ), для работы нужен Google Gears (+mootools), если его нет — делается fall-back на обычную отправку форм. Умеет пережимать картинки на клиенте, показывать прогресс-бар при загрузке файла (изменения на серверной части не нужны), в качестве плюшки сделана интеграция с джанговскими формсетами (что позволяет делать массовую загрузку картинок с ресайзом на клиенте, не меняя код на сервере — используя там обычные formset'ы).

Но все пока не супер-продакшн качества. В ИЕ вроде не работает прогресс-бар, нужно смотреть. Кому интересно, можете потестировать. В репозитории есть пример django-проекта, хорошо бы еще php сделать) Тоже хотел про все это написать сюда на хабр с подробными инструкциями и примерами, но руки пока не доходят.
С ишаком действительно всегда много мороки. Я в своем загрузчике вроде поборол все его реинкарнации )
>>>Умеет пережимать картинки на клиенте
Не подскажете, этот функционал обеспечивается Google Gears, или чем-то другим?
Да, Gears'ом. Из-за этого функционала все и затевалось, по сути. Остальное (загрузка обычных файлов, отправка форм) — побочные эффекты.
Пожалуй стоит с этой либой поплотнее познокомиться…
молодцом, смотрится на 5.
спасибо )
Спасибо большое, именно это я и искал!
не за что ) Очень приятно.
В целом мне и обычный плагин форм нравится. У меня к нему свой класс на PHP написан. Сейчас еще со Smarty его пытаюсь подружить.
Но вот загрузчик файлов я себе позаимствую, немного переработав, если вы не против =))
Для того и выкладывал ) Удачи вам разобраться с немножко сумбурным кодом загрузчика ) Хотя я его сегодня уже причесал немного) Заранее прошу прощения за отсутствие комментариев )
Кстати, насчет PHP класса для плагина )
У меня для CodeIgniter написана модель, помогающая работать с данными, полученными посредством этого плагина. Имеются следующие методы:
get — получения данных по условию
set — установить новые значения
exist — проверить, существуют ли переданные в метод ключи в этом массиве
delete — удалить указанные ключи
deleteAllBut — удалить все ключи кроме указанных
sizeOf — количество ключей в указанном подмассиве
strlen — получает список ключей, а так же интервал min и max длины строки (можно каждому ключу задать свой интервал). И возвращает true, если все ключи прошли проверку, иначе — false. Так же если передать еще один флажок, то вернет развернутый отчет — true\false по каждому ключу.
setParams — заменить текущий массив для обработки на новый
У меня формы завязаны на базу. Сначала описывается сама форма:

<?php
/**
 * Форма USERS
 */
$forms->create('users', array(

	'method' => 'post', // метод отправки
	'action' => '/ajax/xforms/action_users.php', // скрипт обработки
	'class' => 'standart', // CSS класс
	'table' => DBUSERS, // таблица БД

	'fields' => array(

			'id' => array( 'type' => 'hidden' ),

			'email' => array( 'type' => 'text', 'label' => 'Email', 'notice' => 'необходим для авторизации' ),
			'password' => array( 'type' => 'password', 'label' => 'Пароль', 'notice' => 'только чтобы изменить' ),

			'solt' => array( 'type' => 'hidden' ),
			'kod' => array( 'type' => 'hidden' ),

			'fname' => array( 'type' => 'text', 'label' => 'Фамилия' ),
			'lname' => array( 'type' => 'text', 'label' => '* Имя'/*, 'obligatory' => 1*/ ),
			'tname' => array( 'type' => 'text', 'label' => 'Отчество' ),

			'phone1' => array( 'type' => 'text', 'label' => 'Телефон' ),
			'phone2' => array( 'type' => 'text', 'label' => 'Факс' ),
			'phone3' => array( 'type' => 'text', 'label' => 'Мобильный' ),

			'firm_value' => array( // no DB
				'type' => 'suggest', 
				'label' => '* Фирма',
				'ajax' => '/ajax/suggest/sug_users_firms.php',
				'field_value' => 'firm',
			),
			'firm' => array( 'type'=>'hidden' ),
			
			'contr_value' => array( // no DB
				'type' => 'suggest', 
				'label' => 'Контрагент',
				'ajax' => '/ajax/suggest/sug_users_contr.php',
				'field_value' => 'contractor',
			),
			'contractor' => array( 'type' => 'hidden' ),
			
			'position' => array( 'type' => 'text', 'label' => 'Должность' ), // должность
			'otdel' => array( 'type' => 'text', 'label' => 'Отдел' ),
			'other' => array( 'type' => 'textarea', 'label' => 'Дополнительно' ),

			'date' => array( 'type' => 'hidden' ),
			'last_date' => array( 'type' => 'hidden' ),
			'ip' => array( 'type' => 'hidden' ),
			'fix_ip' => array( 'type' => 'hidden' ),
			'status' => array( 'type' => 'hidden', 'label' => '' ),

			'submit' => array( 'type' => 'submit', 'value' => 'Сохранить' ),

	),
));
?>


Поля, соответствующие таблице могут писаться в базу. В соответствии с ним происходит обработка в JS при вводе информации в фронтэнде и при сохранении в бакенде. отправка происходит через формы JQuery, если включен JS или как обычно, если выключен.
Есть реализация интеграции с Jquery-UI.

Так еще доступны типы int, float, select, radio и некоторые другие.

Сейчас доступны методы:

create() — создание формы (см. выше)
getForm( 'formname' ) — вернет описание формы, как массив выше
clear() — очистит значения value у полей
getPost() — дёрнет из поста соответствующие полям индексы (нужно, когда считывает отправленные данные, этот же метод производит чистку данных по типам)
setTable() — сохранит данные в таблицу БД
getTable() — загрузит данные из таблицы БД

getValue() — получить значение поля
getValues() — получить значения всех полей
setValue() — установить значение поля
setValues() — установить значения всех полей

setVariants() — установить варианты для полей select, radio и checkbox (порой надо, чтобы эти значения заполнялись динамически из базы, например)

write() — распечатает форму в автоматическом режиме (есть несколько вариантов)

setReadonly() — утановить поле в readonly (также может отменить readonly)
setRaedonlyAll() — установить все поля в readonly (также может отменить readonly)
setHidden() — делает некоторые поля скрытыми/не скрытыми
setTypes() — можно для некоторых полей поменять тип

Как-то так.
Из селекта созвращаются только названия полей, а их values нет.
Простите, не посмотрел код.
Ага, значения полей тоже русские)
У вас много «зашитого» html кода внутри плагина — это не найс (например: «Загрузка началась. Пожалуйста, подождите...», там много такого). Можно все служебные тексты в отдельный json кусочек вынести. Я бы вообще не писал своих текстов а вызывал пользовательские функции, которые бы писали текст, если нужно.
часто делают объект settings с настройками по умолчанию, а потом делают его extend
Да, я уже тоже подумываю о выносе всех языковых строк в настройки, для мультиязычности ) Это тоже обязательно будет сделано.
мне вот интересно а как получить скорость передачи файла?
размер файла, деленный на процент переданного, деленный на время?
вы написали че-то не то, я знаю как вычисляется скорость, в данном случаи просто кол-во переданной информации деленное на время, скорость не зависит от размера файла.
во-вторых, может я неправильно выразился, но мне было интересно как получить кол-во переданной информации в данный момент
чуть выше упоминали uploadprogress_get_info, да и в коде серверной части плагина она упоминается:
function_exists(«uploadprogress_get_info»)

можно еще поискать аналоги.
Если не установлено раширение с uploadprogress_get_info, но установлено APC (что встречается), получить количество загруженного контента можно с помощью функции apc_fetch().

Пример, например, по ссылке
www.ibm.com/developerworks/library/os-php-v525/index.html
Что ж, достаточно немного модифицировать upload.php )
Расскажите пожалуйста как подключить uploadprogress_get_info
Опишите пожалуйста как его установить. Вещь нужная почти для каждого сайта.
Сам я, когда разрабатывал этот плагин, просил установить uploadprogress нашего админа. Но вот навскидку ссылка:
andyceo.ruware.com/blog/andyceo/kak-ustanovit-pecl-biblioteku-na-server-ubuntu — как установить pecl-расширение на убунту.
handynotes.ru/2007/06/pecl-php.html — а это под виндой.
К сожалению, не смогу вам помочь полноценно =\
Если не вы админите серв, попробуйте попросить его владельцев поставить это расширение.
Спасибо. Первая ссылка не работает. Хабраэффект ?)
в папке где находится pecl нужно запустить
./pecl install uploadprogress
правда до конца не поставилась через
ERROR: `phpize' failed
использую XAMPP
Всё красиво, но вот только не хватает возможности выбора и загрузки сразу нескольких файлов
Над множественным выбором обещаю подумать, как лучше реализовать )
Если еще и это реализуешь — цены тебе и твоему плагину не будет
Реализовано! При инициализации makeUpload теперь можно передать еще один параметр multi:true. Демо обновлено
НЛО прилетело и опубликовало эту надпись здесь
Уже на вашем сервере не работает, или в демке?
НЛО прилетело и опубликовало эту надпись здесь
Ну да, кодировка должна быть utf-8.
А как именно отрабатывает скрипт? Просто ошибка, или же он все же пишет, что отображение прогресса загрузки не поддерживается сервером?
НЛО прилетело и опубликовало эту надпись здесь
Так может быть все же причина в том, что не стоит расширение uploadprogress для php? (http://pecl.php.net/package/uploadprogress)
НЛО прилетело и опубликовало эту надпись здесь
Сообщение о том, что отображение прогресса не поддерживается, может быть вызвано лишь тем, что функция function_exists(«uploadprogress_get_info») возвращает false. Попробуйте в каком-нибудь левом скрипте посмотреть результат выполнения этой функции.
НЛО прилетело и опубликовало эту надпись здесь
При таком варианте есть одна проблемка: папка tmp, куда изначально грузятся файлы, не всегда доступна. Все от хостера зависит.
НЛО прилетело и опубликовало эту надпись здесь
Только очень уж гудение в комнате досаждает =)
НЛО прилетело и опубликовало эту надпись здесь
Плагин обновлен. Добавлена мультизагрузка и исправлен баг при повторной загрузке файла (был неприятный глюк). Необходимо обновить upload.php и jquery.form.js
Молодцом, так быстро и качественно дополнять и исправлять! Ни каждому дано)
Откройте для себя uploadify. Флеш стоит почти у всех.
Я уже выше приводил свои аргументы, почему я против использования flash в аплоадерах.
Вчера невнимательно перезалил обновления плагина, из-за чего весь день демо, оказывается не работало. Теперь fixed )
Сейчас тоже не работает
Оп, сжатие js и css на серваке отказало. Ща отключил его к хренам. Пробуйте ;)
Загружать данные формы и файл одновременно оно умеет?
Т.е. загрузка не просто файлов, а файлов с описанием, но, условно говоря, в одном запросе?
Можно конечно, располагайте все эти элементы с одинаковым идентификатором формы.
ах да, еще
что происходит при ошибках загрузки? :)
А вот этот момент, если честно, не продуман )
нету ни демо, ни самого плагина :((
sms-uslugi.ru/habr.rar — временное решение проблемы. Тут демка и скрипт.

Ща разберусь что с тем адресом случилось.
спасибо :)
это значит так- берем меняем библиотеку с 1.3.1 на 1.4.2 и скрипт радостно дохнет )
в get не входит вот сюда $.each(inputs,function(){
— пока не понимаю как пофиксить, но наверно у вас не то что-то с синтаксисом
извиняюсь — это не у вас проблема, а в кривом сборщике моего 1.4.2.min.js была :)
Угу ) У меня тоже с 1.4.2 все нормально робит ;)
Кстати,
я тут ещё мучался с set пока не понял что в jquery UI надо вызвать после установки ещё и рефреш
$(«имя»).buttonset(«refresh» );
Добавьте на любой репозитарий, не работает ничего. github.com. У кого есть, отпишитесь пожалуйста.
Удивительно, вы уже второй за сегодня, кто обратился за плагинчиком =)
Вот временная ссылка на js и php файл — upload.com.ua/get/901687340/
Ни одна ссылка ни не демо ни на плагин не работает.
Не могли бы Вы демку сбросить на какой нибудь файлообменник.
В смысле не только те, что скачались с временной ссылке, но и пример использования.
Спасибо
У меня, к сожалению, не сохранились примеры, я их вместе с хостингом потерял. Так что только скрипты, что по ссылке в комментарии выше, доступны. Прошу прощения
И на том спасибо. Разберемся.
уважаемые, скиньте пожалуйста демку рабочую, у меня не получается работать с этим плагином…
В общем пока разбирался нашел схожее решение только без upload'а файлов.
Может кому пригодиться — www.linkexchanger.su/2008/45.html
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории