Pull to refresh

Comments 67

>загрузчик фалов на сервер
Угловая скорость вращения дедушки Фрейда слегка увеличилась:)
Исправьте пожалуйста.
в хроме невозможно выбрать более 10 файлов одновременно — можно это обойти?
Проблема заключается в том, что общее количество символов в именах файлов не должно превышать ~220 символов. Пока вроде такая проблема только в хроме на винде.

codereview.chromium.org/4198004
Спасибо за информацию. Как раз щас предстоит делать загрузку файлов на HTML 5, в дополнение к Silverlight.
под виндовс действительно есть такая проблема в хроме, но бывает и выбирает больше) Пока не знаю, какая причина. В линуксе все нормально.
А как вы решили проблему загрузки файлов с помощью Ajax в ИЕ и Опере?
Свой загрузик пишите или какое-то решне выбрали? По универсальности мне больше этот нарвится www.plupload.com/example_custom.php, но уж слишком громоздкий.
Да, скорее всего plupload.

Но опять же, наверное, самый значимый для нас минус большинства загрузчиков — это то, что у загрузчика есть собственный гуи. Пусть можно изменять стили, пусть как-то его гуи можно настраивать — все таки, имхо, аплоадер должен только загружать файлы, а как ему эти файлы передадутся — уже не его задача.

Да и очень хочется самостоятельно написать на флеше аналогичный загрузчи просто для собственного развития) Но за это деньги не платят, а работать должно все «уже сейчас»).
Да, у plupload можно выкинуть весь его гуи и использовать только ядерное апи.

И поскорей бы все браузеры подтянулись с FormData.

Пересмотрел кучу плагинов и решений на HTML5. Valums — показался мне лучшим вариантом. Стилизовать легко, необходимые функции написаны, работает во всех браузерах.
Спасибо, elFinder-у действительно не хватало нормального мультиаплоадера.
у меня завис ваш пример, что-то он корявый, я все же ухитрился бы флэш привязать. в свое время облез кучу всего, нужно было в реальном времени подгружать кучу файлов и чтобы они тут же парсились и появлялись на сайте в реалтайме, так вот пользовал и аякс на jquery и все что угодно, были проблемы пока полностью не перешел на флэш загрузку: быстро, удобно, красиво, есть прелоадер (а это важно было в моем проекте, ибо файлы иногда лились по 20-30 мегов и пользователь видел что сайт не завис). вобщем пришлось выучить флэш и написать свой загрузчик…
вобщем пришлось выучить флэш и написать свой загрузчик…

Разве мало готовых флеш-загрузчиков?
у меня завис ваш пример, что-то он корявый, я все же ухитрился бы флэш привязать. в свое время облез кучу всего, нужно было в реальном времени подгружать кучу файлов и чтобы они тут же парсились и появлялись на сайте в реалтайме, так вот пользовал и аякс на jquery и все что угодно, были проблемы пока полностью не перешел на флэш загрузку: быстро, удобно, красиво, есть прелоадер (а это важно было в моем проекте, ибо файлы иногда лились по 20-30 мегов и пользователь видел что сайт не завис). вобщем пришлось выучить флэш и написать свой загрузчик…
изначально, когда я еще писал на jquery мне очень помог iframeupld.js (его легко найти в инете)
Важно было отправлять с файлами данные POSTом, а так же загружать файлы пачками.

Собственно, сейчас и делаем флеш загрузчик.
Каждый изобретает свой велосипед.
Самым «вкусным» в виде Blob вы не воспользовались.


Нельзя использовать readAsBinary, на больших файлах это сожрет всю память юзера.

FF редко вызывает событие progress у XMLHttpRequest, в отличии от хрома или Сафари.

А вы пробовали вешать обработчик на xhr.upload.onprogress?
Прошу прощения, заглянул в код, там обработчик на xhr.upload.onprogress вешается.
Значит это глюк ФФ, по спецификации www.w3.org/TR/XMLHttpRequest2/#make-upload-progress-notifications событие должно вызываться либо раз в 50мс, либо на каждый байт, в зависимости от того, что происходит чаще.
факт в том, что получить 100% ни разу не удалось) Хотя иногда доходило до 99, но чаще всего останавливается в пределах 80
смотрим) Но я так понял, он тоже по одному отправляет?
Я так и не понял, зачем вам отправлять файлы группами?
Для того, чтобы уменьшить количество соединений
Хм, очень странный аргумент.
А зачем вам уменьшать кол-во соединений? Вы уперлись во что-то? Или просто так захотели от балды?
Ну, не могу дать точного ответа. Наверное, от балды — испугались возможной тысячи юзеров, одновременно решивших загрузить 1000 файлов)
А вы не пугайтесь, если конечно вы используете nginx или что-то подобное.
Поверьте мне, ваши диски раньше начнут «втыкать», чем вы достигните тысяч соединений.
Ну да, но все же мало ли что, тем более было интересно, возможно ли это сделать)
Кстати Опера тоже поддерживает Мультизагрузку файлов. В ней ваша форма застряла на
Output:

STARTING ...
Опера не поддерживает FormData и FileApi
там используется FileReader, но в хроме столкнулись с такой проблемой, что файлы получаются битыми, не знаю, из-за чего это может быть.

Мне кажется, что FormData гораздо удобнее для отправки данных. FileReader больше подходит там, где нужно еще как-то взаимодействовать с файлами, кроме просто отправки на сервер, имхо.
Я пошел по этому же пути и добавил в свой код использование FormData там, где это возможно. Получилось, наверное, почти как у вас. Тока я еще в jQuery-плагин все это завернул.
Лучше поздно, чем никогда :)

Если интересно, то вот jQuery-плагин по мотивам моей статьи, использующий FormData там, где это возможно, и позволяющий управлять очередью загрузок. В самом файле есть описание его использования. Ссылку на работающий пример и кое-какие подробности можно увидеть в UPD той самой статьи.
посмотрим, спасибо)
Я немного доработал свой код, он в сафари работает нонче. Все не доходят руки на хабр выложить. Чуть позже дам линк.
Давать читать это всем, кто начинает писать статьи на Хабре! 5 минут на чтение — минус рабочая неделя на мозготоптательный дебаг…
Статей по поводу работы с HTML5 немеряно, но статей с четкой постановкой задач и указанием на нюансы и без воды — единицы.

Респект.
Используйте plupload либо мою альтернативу Lightweight Uploader
Если хотите иметь регулярный секс — то, конечно, пишите своё )
да, мы остановимся на plupload, наверное. Но иметь регулярный секс полезно для здоровья все равно)
Кстати, хорошая у вас альтернатива. А для чего nginx используете при аплоаде?

Будет ли ваше решение загружать файлы, если файлы будут закачиваться с адреса, например, site.ru на адрес u1.site.ru?
nginx вместе c upload-модулем используется:
а) для того, чтобы бэкенд вступал в дело только после полного окончания загрузки; при этом не происходит копирование файла в STDIN бэкенда, ему передается лишь ссылка на уже сохраненный upload модулем временный файл
б) для поддержки дозагрузки, которую дает upload модуль

Будет ли ваше решение загружать файлы, если файлы будут закачиваться с адреса, например, site.ru на адрес u1.site.ru?

Хороший вопрос )
Будет (после небольшого фикса с моей стороны) и если использовать последнюю версию upload модуля из гита, которая обрабатывает метод OPTIONS с помощью директивы upload_add_header.
Я имел в виду, что фиксить надо html5 загрузку, конечно же.
Flash и Silverlight загрузка будет работать между доменами при правильно настроенных файлах u1.site.ru/crossdomain.xml и u1.site.ru/clientaccesspolicy.xml (хотя по идее и первого будет достаточно).
Собственно, в гите уже есть фикс для кроссдоменной html5-загрузки.
Спасибо. На днях попробую внедрить вашу загрузку в свой проект.
А загрузка будет работать без upload-модуля? Так как если его ставить, то нужно собирать энджинкс в ручную, а это не есть debian way на продакшен сервере.
Будет, если вы сами повторите протокол частичной загрузки на бекенде.
Сильверлайт очень плохо загружает большие файлы целиком, точнее сначала полностью загружает в память (видимо для высчитывания заголовка Content-Length, который вручную нельзя установить), и только потом начинает загружать на сервер.
А может дороботать ваше решение, что бы частичная загрузка работала опциоанльно. Что бы ее можно было оключить, если upload модуль не установлен. Тогда это решение будет более универсальным и не заточеным под энджинкс с его модулем.
В принципе, можно, правда в этом случае нельзя будет использовать сильверлайт-плагин, а т.к. html5 еще не особо распространен, то остается только флэш.
А по моей статистике, флэш — это наихудший способ загружать файлы, он создает больше всего ошибок.
А что такое «debian way»? И почему он не совместим с ручным билдом?
Это когда все программы ставятся из пакетов. И ручная сборка не приветствуется. Потому что пакеты имеют тенденцию обновляться закрывая баги или при выходе новых версий. И обновление всего ПО на сервере в этом случае приосходит с помощью одной одной/двух команд. А при ручной сборе, необходимо при выпуске новых версии все пересобирать в ручную и еще отслеживать версии. Короче гемор один и усложнение жизни админу. Поэтому в пакетных операционках не приветствуется ручная сборка пакетов.
Ошибаетесь.
dev.w3.org/2006/waf/access-control/ — это уже поддерживают Chrome, Safari и Firefox. Ребята из Opera как обычно заняты им одним ведомыми делами, но думаю скоро и они подтянутся.
Я сначала не заметил, что вы ответили. Но все равно не знал, спасибо)
Стоит упомянуть, что sendAsBinary — отсебятина Mozilla и нигде, кроме FF, не существует.
Да. В презентации есть это, там еще кстати рассмотрены некоторые аспекты, которые в статье не упоминались.
Если загрузить файл драг&дропом, а затем попытаться загрузить через кнопку, то в хроме выпадает ошибка Uncaught ReferenceError: onuploaded is not defined.
точняк, опечатка :\
Начал внедрять ваш аплоадер и оказалось, что он не отправляет и не получает кукисы. Если вам не сложно, то допишите пожалуйста работы с куками.
Вам. Ваш аплоадер не работает с кукисами.
Sign up to leave a comment.

Articles