Можно отложить закачку большого файла
Многие сталкивались с проблемой при закачке файлов, что сервер упорно пытается загрузить слишком большие для нас файлы и этот процесс не только тормозит пользователя, заставляя его понапрасну долго ждать, но и загружает сам сервер, на который происходит закачка файла.
- ограничить закачку файла настройками самого PHP
- ограничить закачку файла используя механизмы отправки запроса формы на сервер (только методом POST)
Мне бы хотелось рассмотреть именно его.
Итак, начнем с того, что укажем в форме method="post" и enctype="multipart/form-data" . Далее создадим скрытый элемент формы
В значении элемента MAX_FILE_SIZE указываем нужный нам максимальный размер в байтах загружаемых файлов.
Особое внимание нужно обратить на то, что этот элемент должен стоять ДО полей выбора файлов (например, сразу после тега form):
Что происходит на практике (хотя некоторые конфигурации PHP и Apache запрещают данный метод):
PHP получает первым делом наш параметр ограничения размера файлов. Далее считывает его значение, далее «сбрасывает» элементы массива $_FILES, где размер файла превышал необходимый.
Пример того, что он творит с таким элементом:
Array ( [photo] => Array ( [name] => my_photo.jpg [type] => [tmp_name] => [error] => 2 [size] => 0 )
Как видим он ставит для такого элемента код ошибки отличный от 0 (0 = удачная загрузка), данная ошибка гласит: «The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form» или «Размер загруженного файла превысил значение MAX_FILE_SIZE, установленное в HTML форме».
- некоторые браузеры могут (пользуясь данной директивой) сами обрывать закачку файла на сервер (природа данного эффекта мне лично не известна и в документациях браузеров про нее не нашел)
- это НЕ обязательная директива для браузеров
- в браузерах данное ограничение можно легко обойти
- в Mozilla Firefox (тестировалось на версиях 2 и 3) ограничение на стороне браузера не срабатывало
- в IE начиная с 6ой версии (на ниже версиях не тестировал) и Opera (начиная с 8.5ой версии) работало
в теории (сам не проверял) параметр ограничение через форму MAX_FILE_SIZE приоритетнее параметра upload_max_filesize в php.ini
ЗЫ: Надеюсь, данная статья поможет многим кодерам, особенно тем, кто не имеет прав сервера на изменение настроек PHP на сервере.
ЗЗЫ: В своем топике я просто хотел описать один из механизмом и свой опыт его использования. Это не в коем случае НЕ пособие к обязательным действиям, так как он всего лишь является дополнительным, в каких-то случаях удобным, механизмом проверки.
ЗЗЗЫ: Отредактирован с учетом выссказываний, пожеланий, споров и советов в комментариях.
Например, нужно скачать 9 файлов. Стоит ли их скачивать в 3 потоках или в одном?
@andreycha Я вижу 2 противоположных мнения с одинаковым количеством голосов. Как я должен решить кто прав?
Где скачать программу для ускорения загрузки файлов
7. Folx
- Поддерживаемая платформа: macOS.
- Цена: бесплатно / 20 долларов.
Универсальный инструмент для скачивания любых данных, который несмотря на обманчиво простой интерфейс имеет множество функций. Folx интегрируется в браузеры и распознаёт ссылки из буфера обмена, позволяя сохранять файлы, видео с YouTube и торренты. Последние можно искать прямо внутри приложения.
Программа разбивает загрузки на несколько потоков, повышая скорость. Кроме того, Folx умеет автоматически сортировать файлы в зависимости от типа и присваивать им теги. Также есть поддержка прокси, загрузка по расписанию и встроенный менеджер паролей для сайтов.
Однажды в очередной раз возникла задача о закачке относительно больших файлов. Говоря конкретно, клиент захотел заливать на сайт через админку видеоролики размером 20-40 мегабайт. Казалось бы, в наше просвещенное время подобный размер — это такая мелочь, о коей и говорить стыдно. Но внезапно все уперлось в настройки виртуального хостинга. Мы с ужасом обнаружили, что максимальный размер закачиваемого файла — 2M, и поменять эту цифру нет возможности. И менять хостинг по ряду причин нельзя — по крайней мере не сейчас.
Самая первая наша реакция — посмотреть возможности различных флеш-аплоадеров. Ведь не может быть, чтобы мировая техническая мысль не реализовала такой полезной вещи, как загрузка файла по частям. Перебираем последовательно Uploadify, SWFUpload, FancyUpload, jqUploader, jquery-transmit. Но все тщетно. Искомой фичи мы не видим. Вполне вероятно, что надо копать дальше, но время поджимает, и надо уже что-то делать…
Вышеописанное печально. Однако нам на руку играет тот факт, что это админка. Т.е. нам вовсе не нужно ориентироваться на кроссбраузерность. Достаточно того, что этот механизм будет работать на браузере клиента, каковым (о чудо!) является FF.
Тут же вспоминаем, что в FF последних версий есть возможность получить в строку содержимое файла, загруженного в поле file-upload. И в голову приходит желание разбивать эту строку на куски и закачивать частями, используя Ajax.
Клиентская часть
Сначала нарисуем необходимое в статическом HTML:
Теперь нам надо написать ту самую функцию big_file_upload:
Получение содержимого файла
Для получения содержимого файла будем использовать следующую конструкцию:
- file.get(0) — получение DOM-объекта из jQuery-объекта, переданного в функцию
- files.item(0) — получение первого файла из списка. Здесь он у нас единственный, однако напомню, что уже есть возможность множественной закачки файлов из одного контрола.
- getAsDataURL() — получение содержимого файла в формате Data:URL. Есть еще методы getAsText и getAsBinary, однако нам нужно передавать на сервер методом POST, поэтому желательно получить содержимое файла, закодированное в Base64.
Поскольку содержимое у нас в формате Data:URL, то неплохо было бы отрезать заголовочную часть, в которой находится информация о MIME-типе и способе кодирования. В более общем варианте нашей функции эту информацию надо бы использовать, но в данном примере она нам только будет мешаться при декодировании. Поэтому просто отрежем все по первую запятую (включительно), которой отделяется заголовок:
Отправка файла кусками
Здесь все банально:
Серверная часть
Теперь сделаем на сервере принимающий PHP-скрипт upload.php. В варианте для примера он также предельно прост:
Файл открывается с опцией «а», т.е. предлагается не перезаписывать существующий файл, а дополнять его. Таким способом мы из кусков соберем целый файл.
Думаю, всем понятно, что данный скрипт должен лежать в закрытой админской части сайта чтобы к нему не имели доступа разные личности со стороны. Кроме того, имя файла и сам файл должны проверяться на валидность. Иначе — это даже не уязвимость, а… я и слова-то такого не знаю…
Пробуем запустить
Попробовали? Получилось? Держу пари, что получилось совсем не то, что ожидалось. Файл вроде бы закачался. Вроде бы даже длина правильная. А вот содержимое — какая-то каша.
Почему так получилось? Ответ прост: POST-запросы отправляются в асинхронном режиме по нескольку кусков одновременно, поэтому никто не гарантирует, что на сервер они будут приходить именно в той последовательности, в которой были поданы команды на отправку. Мало того, что никто не гарантирует, а я прямо-таки утверждаю, что никогда они не придут в нужной последовательности. Всегда будет получаться каша.
Поэтому, как это ни грустно, придется асинхронность отключить. Перед оправкой файла выполним следующее:
Теперь все нормально. Файл собирается в нужной последовательности, однако на время закачки исполнение прочих скриптов приостанавливается. Поэтому, чтобы не нервировать пользователя, было бы неплохо где-нибудь показывать процентики или прогресс-бар. Таким образом, работоспособный скрипт выглядит следующим образом:
Недостатки
- В данном примере предполагается, что метод getAsDataURL всегда возвращает данные, закодированные в base64. На самом деле я бы не стал биться об заклад, что так будет всегда. По-хорошему, заголовок надо не выкидывать, а передавать серверной части, которую, в свою очередь, научить обрабатывать данные, закодированные разными способами.
- Файл, отправленный два раза, запишется на сервере два раза. Причем дополнит сам себя. Чтобы избежать этого, видимо, нужно передавать кроме имени еще и какой-то уникальный идентификатор закачки. Но это, вообще говоря, вопрос способа формирования и передачи имени файла. Здесь универсального рецепта нет и быть не может.
- Клиентский скрипт исполняется долго (в зависимости от размера файла и толщины канала), и FF может даже поинтересоваться: вы, мол, уверены ли, что надо ждать окончания, или убить его чтоб не мучался?
- Кроссбраузерность. Получение содержимого файла, увы, работает только на FF. Проверено на 3.0, 3.5 и 3.6. На более ранних не проверялось за неимением таковых под рукой. Сами разработчики FF рекомендуют вместо это способа пользоваться FileAPI, однако оно появилось только в 3.6.
- Действительно большие файлы (сотни мегабайт, гигабайты) закачать таким способом не получится. Предел зависит от объема памяти, доступной браузеру.
Что сделать?
Вероятно, надо попробовать все-таки в асинхронном режиме. Для каждого куска передавать еще и информацию о его расположении внутри файла. При этом серверная часть серьезно усложнится.
Выводы о программе для ускорения загрузки файлов
Программа DownLoad Master имеет несколько языков интерфейса, позволяет задавать оптимальные настройки для различных типов соединений. наличие в программе истории закачек, поиска, возможность просмотреть и прослушать видео- и аудиофайлы во время скачивания делают программу DownLoad Master мощным многофункциональным инструментом для закачек файлов из интернете, однажды познакомившись с которым, Вы уже не захотите больше расставаться.
Ребята все конечно красиво и хорошо только есть одно Но для интеграции в яндекс браузер нет расширения ни в яндексе ни в гугле. поэтому никаких перехватов и интеграции НЕТ. Огромная просьба если кто знает где его(расширение) взять то скиньте ссылку пожалуйста!
Бесплатный кросс‑платформенный загрузчик с современным дизайном и русифицированным интерфейсом. Free Download Manager умеет скачивать не только обычные файлы, но и торренты, видео и музыку. При этом можно просматривать медиафайлы ещё в процессе загрузки и преобразовывать их в другие форматы по её окончании.
Программа поддерживает разделение файлов на части для ускорения загрузки, возобновление прерванных передач, а также интеграцию в браузер, планирование действий и гибкую настройку использования трафика.
4. Persepolis
- Поддерживаемые платформы: Windows, macOS, Linux.
- Цена: бесплатно.
Минималистичный загрузчик, в основе которого лежит известная консольная программа для скачивания Aria2. Несмотря на аскетичный внешний вид, Persepolis не уступает в возможностях конкурентам. Здесь есть многопоточное скачивание, планировщик и настраиваемая очередь, а также интеграция с браузерами, поддержка загрузки видео с YouTube, Vimeo и других платформ.
6. EagleGet
Сбалансированное приложение с поддержкой тем оформления и гибко настраиваемыми уведомлениями. EagleGet разделяет файлы для ускорения скачивания, умеет подхватывать ссылки из браузера, а также позволяет назначать приоритеты, управлять использованием канала и добавлять задачи в очередь загрузки. Кроме того, в программе есть встроенное средство проверки вредоносного ПО и целостности данных.
3. Ninja Download Manager
- Поддерживаемые платформы: Windows, macOS, Linux.
- Цена: 19 долларов.
Удобный менеджер загрузок с лаконичным интерфейсом и массой полезных функций. Как и аналоги, он ускоряет скачивание за счёт разделения файла на фрагменты и одновременной работы с несколькими сегментами.
В Ninja Download Manager много настроек по части планирования, очереди передачи контента и управления трафиком. Также есть проверка целостности файлов по окончании загрузки и предварительный просмотр, благодаря которому можно ознакомиться с видео уже через несколько секунд после начала скачивания.
5. Download Master
Один из самых известных и старых менеджеров загрузок для Windows, который до сих пор развивается и регулярно обновляется. Download Master умеет скачивать данные с обычных сайтов, FTP, файлообменников и практически с любых видеосервисов, в числе которых YouTube.
Из ключевых особенностей можно выделить возможность просмотра файлов внутри архивов и их выборочной загрузки, умное управление скоростью, а также интеграцию с буфером обмена и браузерами, автоматическое назначение категорий и настраиваемые сценарии после выполнения всех заданий.
2 ответа 2
С т.з. обращения к веб-серверам и получения с них информации -- стопроцентно имеет. Можно и по потоку на файл.
Однако если вы планируете сохранять скачанные файлы на диске, то надо понимать, что диск практически не параллелится. Какое-то ускорение вы получите, но нужно экспериментировать.
Если память позволяет, я бы максимально параллелизовал скачивание файлов в память, а затем установил небольшую степень параллелизации для сохранения на диск.
Скорее всего нет. Если Ваш канал "уже" скорости, которую может отдать сайт, то хоть в 100 потоков качай, скорость не прибавить. Но некоторые сервера ограничивают скорость скачки для одного файла и при этом ограничивают ее сильно. В этом случае скачивать нескольких файлов одновременно может принести пользу (до тех пор, пока канала хватает). Если файлы качаются с разных серверов и Ваш канал явно шире возможности серверов, тогда есть смысл качать в несколько потоков (но по потоку на файл). Но при этом, главное не уперется в скорость диска.
Эта вся шумиха с закачкой файлов пошла с тех времен, когда интернет был медленный и тяжелый. Когда tcp/ip стек работал плохо. Был спутниковый интернет (да и мобильный который назывался CDS), который в один поток не мог пустить больше определенной скорости (от 2400 до 9600). Но таких потоков могло быть много. И вот в этом случае скачка в много потоков давала реальное ускорение.
2. uGet
- Поддерживаемые платформы: Windows, Linux, Android.
- Цена: бесплатно.
Ещё одно кросс‑платформенное приложение с открытым исходным кодом, которое встраивается во все популярные браузеры, поддерживает многопоточное скачивание и умеет подхватывать ссылки из буфера обмена. Кроме того, в uGet есть планировщик, автоматические действия по окончании загрузки, разделение файлов на категории и пакетный режим.
Установка программы для ускорения загрузки файлов
Установка программы проста - используется стандартный мастер установки для Windows-программ, с которым все пользователи операционной системы Windows хорошо знакомы. Мастер задаст несколько стандартных вопросов, ответив на которые вы самомтоятельно установите программу на свой персональный компьютер или ноутбук.
Программа имеет встроенный FTP-клиент, настройка и запуск которого осуществляется при нажатии кнопки FTP-Explorer главного окна программы.
Стоит заметить, докачка файла при использовании программы DownLoad Master возможна не со всех сайтов. Но для большинства сайтов такая воможность присутствует, что является несомненным плюсом.
Всё ещё ищете ответ? Посмотрите другие вопросы с метками многопоточность загрузка или задайте свой вопрос.
Похожие
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Site design / logo © 2022 Stack Exchange Inc; user contributions licensed under cc by-sa. rev 2022.5.9.42071
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Скачивать файлы из Интернета можно при помощи браузеров. Для этого достаточно просто указать браузеру, куда сохранить скачиваемый файл. Однако есть программы, которые значительно упрощают процесс скачивания файлов из интернета, исключая возможность обрыва закачки и ускоряя сам процесс скачивания.
Особенно это актуально при закачке файлов большого объема (как правило, больше 50 Мб) и/или низкой скорости интернета. Одна из самых популярных программ в данной категории - это DownLoad Master. Неоспоримым преимуществом данной программы является ее бесплатность.
Принцип работы программы для ускорения загрузки файлов
Отличие от торрентов в том, что загрузка файла происходит не с нескольких источников (в качестве источников файла для торрентов выступают компьютеры пользователей, которые скачали себе конкретный файл), а с одного и того же, но по частям.
Настройка автоматического перехвата ссылок в программе для ускорения загрузки файлов
Для того, чтобы программа автоматически перехватывала ссылки на скачиваемые из окна браузера файлы необходимо выбрать пункт меню Инструменты/Настройки и далее перейти в раздел Общие/Интеграция, где установить галочку напротив пункта Интеграция в Google Chrome или Интеграция в Opera или интеграция Mozilla Firefox в зависимости от используемого вами браузера.
После этого будет предложено установить соответствующий плагин для браузера, который необходимо установить, иначе ничего не получится. После установки плагина при щелчке правой кнопкой мыши по ссылке на закачку выбранного файла появится контекстное меню с командами Закачать ссылку и Закачать все ссылки.
После выбора команды Закачать ссылку появится окно, в котором уже будет указан нужный URL файла. Необходимо выбрать директорию для скачивания файла и категорию закачки. Можно отложить закачку и начать скачивание сразу с помощью кнопок Закачать позже и Начать закачку соответственно.
В процессе закачки файла будет доступна кнопка приостановки и возобновления закачки, а также будет показан прогресс закачки и количество потоков скачивания.
Если в настройках программы на вкладке Интеграция установлена галочка напротив пункта Отслеживать URL в буфере обмена, то закачку файла можно начать выбрав в контекстном меню ссылки на файл команду меню Копировать адрес ссылки. Появится окно, в котором уже будет указан нужный URL файла, и можно будет сразу же начать закачку.
Читайте также: