Comments 25
Как минимум в топике не хватает ссылки на пример и ссылки на полный код «класса».
Честно признаться, не понял, чем ваше решение уникальное и почему вы не нашли аналогов (для примера то, с чем сталкивался — jQuery File Upload, Ajax Upload )?
Зачем проверку делать по таймауту, если это можно сделать в complete?
Если пользователей будет >1 ваше решение не поможет.
setTimeout(FilesUploader.controller, FilesUploader.deley)
Зачем проверку делать по таймауту, если это можно сделать в complete?
1).Большим количеством запросов я быстро полажу к чертям свой сервер.
2) Большой объем одновременно загружаемых файлов забьет нам весь канал.
Если пользователей будет >1 ваше решение не поможет.
Спасибо вам, и всем ниже описавшим за ссылки и критику.
К сожалению сейчас не могу проверить все ссылки, но я не нашел не одного готового решения, для загрузки файлов более чем через один запрос, что реализовано у меня.
— это решение для админки, проект не настолько масштабный что бы было задействовано одновременно сразу большое количество администраторов.
Возможно вы не поняли этого момента в статье(а возможно не понял вас я) — вызов новой функции в setTimeout а complete, реализован для того, что проверки происходили через некоторый период времени, а не постоянно, ведь файл мгновенно не загрузится.
К сожалению сейчас не могу проверить все ссылки, но я не нашел не одного готового решения, для загрузки файлов более чем через один запрос, что реализовано у меня.
Если пользователей будет >1 ваше решение не поможет.
— это решение для админки, проект не настолько масштабный что бы было задействовано одновременно сразу большое количество администраторов.
Зачем проверку делать по таймауту, если это можно сделать в complete?
Возможно вы не поняли этого момента в статье(а возможно не понял вас я) — вызов новой функции в setTimeout а complete, реализован для того, что проверки происходили через некоторый период времени, а не постоянно, ведь файл мгновенно не загрузится.
я не нашел не одного готового решения, для загрузки файлов более чем через один запрос
На каждый файл свой ajax-запрос — именно так реализовано в приведенных примерах, какие проблемы?
это решение для админки, проект не настолько масштабный что бы было задействовано одновременно сразу большое количество администраторов
Тогда непонятно, зачем вы беспокоитесь о кол-ве запросов
проверки происходили через некоторый период времени, а не постоянно, ведь файл мгновенно не загрузится.
Зачем делать проверку по таймеру, если ее можно сделать сразу после очередной загрузки файла в complete?
Вот, берите www.plupload.com/ и не мучайте себя в следующий раз. Рекомендую также отделять процесс загрузки фалов от их обработки на сервере.
Извините, что сразу критика, просто возникает множество вопросов:
Странно, что мы не можем настроить сервер таким образом, чтобы он не отдавал 503, и пытаемся «не забивать канал», делая проверку на клиенте, а не на сервере. По мне так это очень плохой костыль.
Странно, что мы считаем объем загружаемых файлов, а не скорость загрузки. Мы вроде хотим «не забивать канал»?
Кроме того имена переменных deley и fStek довольно сильно режут глаз.
Странно, что мы не можем настроить сервер таким образом, чтобы он не отдавал 503, и пытаемся «не забивать канал», делая проверку на клиенте, а не на сервере. По мне так это очень плохой костыль.
Странно, что мы считаем объем загружаемых файлов, а не скорость загрузки. Мы вроде хотим «не забивать канал»?
Кроме того имена переменных deley и fStek довольно сильно режут глаз.
Кроме того, в общем случае не рекомендуется объявлять переменные без ключевого слова var.
Например в функции controller вы выносите переменную item в глобальную область видимости.
Почему вы обращаетесь к свойствам вашего FilesUploader через this?
Когда вы вызываете функцию controller по таймауту this.maxThreads будет undefined, т.к. this уже не указывает на объект FilesUploader.
А в случае, когда надо вызывать функцию через определенный интервал используют setInterval, а не рекурсивно setTimeout.
Например в функции controller вы выносите переменную item в глобальную область видимости.
Почему вы обращаетесь к свойствам вашего FilesUploader через this?
Когда вы вызываете функцию controller по таймауту this.maxThreads будет undefined, т.к. this уже не указывает на объект FilesUploader.
А в случае, когда надо вызывать функцию через определенный интервал используют setInterval, а не рекурсивно setTimeout.
Для JavaScript понятие потока не применимо; интерпретатор выполняет весь код строго по порядку и в один поток: код запущенный через setTimeout/setInterval будет исполнен по истечении указанного периода времени и когда текущая выполняемая интерпретатором функция закончит своё действие.
реальные проблемы при загрузке файлов могут начаться, когда мы грузим большие файлы (от 400мб).
все вышеперечиленые библиотеки не справляються с поставленой задачей, т.к. пытаються сразу прочитать весь файл в память, что в свою очередь вешает браузер.
Я вот тут в посте попытался разобрать процесс частичного чтения файла, что может помочь.
Если есть готовые решения, о которых я еще не знаю — буду очень признателен.
все вышеперечиленые библиотеки не справляються с поставленой задачей, т.к. пытаються сразу прочитать весь файл в память, что в свою очередь вешает браузер.
Я вот тут в посте попытался разобрать процесс частичного чтения файла, что может помочь.
Если есть готовые решения, о которых я еще не знаю — буду очень признателен.
Давно хабраюзер safron написал отличную статью HTML5 File API: множественная загрузка файлов на сервер и недавно обновил и перенес на github код своего jQuery плагина damnUploader. Вот лично я нашел его плагин самым удобным для реализации задачи, подобной вашей.
Приобщу к общим ссылкам ещё вот этот шикарный загрузчик для Twitter Bootsrtap. Довольно большой и сложный, но очень уж толковый интерфейс. На Django лёг как влитой :)
Я уже давно использую valums.com/ajax-upload/ ( qq.FileUploader ) и радости моей от комфорта нет предела — можно перетаскивать в окно браузера несколько файлов, или выбирать их из диалогового окна, а потом наблюдать на прогрессом загрузки каждого отдельно.
Недавно использовал этот загрузчик в одном из моих проектов, удобно. Одно но – не получалось по-своему переименовать загружаемые файлы, например $filename = time(); Потом кое-как решил эту проблему. Даже вопросы на странице разработчика задавал, но ответа не было. Если не секрет, как вы решаете эту задачу?
а вот здесь github.com/valums/file-uploader/blob/master/server/php.php см. строку 171, там в save() можно любое имя файла подставить
Это – да. Но я немного не то имел в виду. Алгоритм такой:
1) Есть форма, в которой несколько полей, скажем, добавление новости для админки.
2) Среди прочих есть поле добавление картинки для новости. Админ загружает картинку, а покуда файл загружается, заполняет остальные поля.
3) Картинка загрузилась, миниатюра появляется в специальном контейнере, а в скрытом поле формы появляется имя файла – для добавления в базу наряду со всеми остальными данными.
4) Вот тут и была проблема – вернуть из php новое имя файла, которое было там сгенерировано.
Я сделал это так:
1) В том месте файла php, где возвращается удача или ошибка:
2) В том месте скрипта javascript, где идет обработка ответа:
Этот метод работает, но он не особенно красивый на мой взгляд.
Как вы считаете, можно сделать изящнее?
1) Есть форма, в которой несколько полей, скажем, добавление новости для админки.
2) Среди прочих есть поле добавление картинки для новости. Админ загружает картинку, а покуда файл загружается, заполняет остальные поля.
3) Картинка загрузилась, миниатюра появляется в специальном контейнере, а в скрытом поле формы появляется имя файла – для добавления в базу наряду со всеми остальными данными.
4) Вот тут и была проблема – вернуть из php новое имя файла, которое было там сгенерировано.
Я сделал это так:
1) В том месте файла php, где возвращается удача или ошибка:
echo 'success_'.$new_filename;
2) В том месте скрипта javascript, где идет обработка ответа:
var my_response = response.split('_');
if(my_response[0] === "success")
{
// показываем только что загруженную картинку
$('<li></li>').appendTo('#files').html('<img src="./uploads/'+my_response[1]+'.jpg" alt="" /><br />'+my_response[1]).addClass('success');
// скрытое поле формы получает новое имя загруженного файла
$('#my_file').attr('value',my_response[1] + '.jpg');
}
Этот метод работает, но он не особенно красивый на мой взгляд.
Как вы считаете, можно сделать изящнее?
deley, а почему не delay?
кто бы сделал дозагрузчик файлов на сервер, это было бы просто супер
Sign up to leave a comment.
Многопоточный загрузчик файлов на JS (jQuery)