Как ограничить размер скачиваемого файла

Обновлено: 07.07.2024

Частая ситуация когда размеры файлов, разрешенных к загрузке на сайте стоят очень маленькие. Особенно этим грешат хостинги, где ставят минимальные настройки, не особо задумываясь о потребностях клиента. Это надо изменить и здесь необходимо провести некоторые настройки PHP отвечающие за размеры. Сам набор параметров я напишу чуть ниже и обозначу за что отвечает каждый из них.

Основные параметры

Итак что влияет на размеры файлов которые разрещены к загрузке в PHP.

upload_max_filesize – Максимальный размер загружаемого файла

Измеряется в мегабайтах или гигабайтах. Дефолтное значение: “2M”

max_file_uploads – Максимальное количество одновременных загрузок

Измеряется в цифровом количестве файлов. Дефолтное значение: “20”

post_max_size – Максимальный размер отправляемого через POST-запрос файла (Должен быть больше upload_max_filesize).

Измеряется в мегабайтах или гигабайтах. Дефолтное значение: “8M”

max_execution_time – Время в течении которого скрипт должен полностью завершить своё исполнение. Для отмены ограничений можно присвоить 0.

Измеряется в секундах или минутах. Дефолтное значение: “30”

max_input_time – Время в течении которого скрипт, должен получить и обработать все данные из POST и GET запросов.

Измеряется в секундах.

memory_limit – Ограничение на выделяемую для исполнения одного скрипта память. Для отмены ограничений, поставьте -1. Должен быть больше post_max_size.

Измеряется в мегабайтах или гигабайтах. Дефолтное значение: “128M”

Как изменить опции настройки PHP

Изменить возможно разными способами, я покажу как это сделать.

1. PHP.INI

Файл php.ini является основным файлом где хранятся настройки исполнения php скриптов. Пользовательский файл настроек обычно находится на несколько уровней выше папки www сайта. Иногда помещён в папку php-bin. Применение: опция = значение

Пример настройки добавленной в файл php.ini:

post_max_size = 512M
upload_max_filesize = 512M
max_execution_time = 3600
max_input_time = 1800

2. .HTACCESS

Файл .htaccess (или htaccess.txt) является содержанием настроек поведения сервера и обработки файлов определённого сайта. Размещается в корне сайта.

Применение: php_value опция значение

php_value post_max_size 512M
php_value upload_max_filesize 512M
php_value max_execution_time 3600
php_value max_input_time 1800

3. Любой PHP файл

Помимо вышеописанных способов, можно сделать изменение настроек к любому PHP файлу.

Применение: ini_set(‘опция’, ‘значение’);

ini_set(‘post_max_size’, ‘512M’);
ini_set(‘upload_max_filesize’, ‘512M’);
ini_set(‘max_execution_time’, ‘3600’);
ini_set(‘max_input_time’, ‘1800’);

* Необходимо учесть, что некоторые хостеры, блокируют изменение данных опций и после применения необходимо связаться с своим хостером, чтобы убедиться, что это работает.

Содержание

Кто может ограничивать объём загружаемых файлов?

Как может быть ограничен объём загружаемых файлов?

Например, если Вы увеличите объём загружаемых данных до 100 МБ и в каком-то поле в одной из форм Вашего сайта, не связанной с загрузкой файлов, а, к примеру, связанной с модификацией данных о пользователе, Вы передаёте какой-нибудь числовой идентификатор (к примеру, номер месяца дня рождения этого пользователя, который, по идее дожен быть числом от 1 до 12), который подставляете в SQL-запрос, то Вам следует приготовиться, что злой хакер передаст в этом поле не число от 1 до 12, а загрузит туда все 100 МБ. Если Вы не настроили Ваш сервер баз данных на обработку очень больших запросов (по умолчанию в My SQL это порядка 16 МБ), то такой запрос приведёт к ошибке, которую и будет эксплуатировать хакер.

  • значительное увеличение времени выполнения Ваших скриптов может снизить защищённость Вашего сервера. Например, это может упростить выполнение DoS-атаки, основанной на том, что большое количество скриптов запускаются и выполняют какие-нибудь длинные бесполезные, на занимающие процессорное время задачи. Если время выполнения скриптов маленькое, то для эффективной DoS-атаки следует постоянно перезапускать скрипты (для защиты в таком случае часто используются блокировки, учитывающие количество обращений с заданного IP-адреса). Если же скрипты выполняются долго, то запустив скрипт однажды, о перезапуске скриптов можно долго не беспокоиться и простой подсчёт количества обращений становится бесполезным.

Внимание! Этот список не является списком всех возможных уязвимостей, которые могут появиться при перенастройке Ваших программ для увеличения объёма передаваемых на сервер файлов.

В связи с чем появилась проблема?

Этот протокол, однако, позволяет передавать данные от пользователю серверу. Это сделано для того, чтобы сервер мог динамически генерировать страницы, в зависимости от пришедших данных. К примеру, сам Apache поддерживает возможность вывода списка файлов, позволяя пользователям пересортировывать этот список разными способами. Способ сортировки задаётся в переменной, которая передаётся методом GET.

Но передача методом GET обладает некоторыми недостатками. Например, с его помощью нельзя передавать важную, конфиденциальную информацию, так как адрес страницы (вместе со всеми переменными, которые переданы этим методом), показывается в адресной строке браузера и записывается в журналы прокси-серверов.

Когда Вы программируете под Интернет, Вам следует всегда помнить, что

Это всё потому, что:

  • FTP предназначен для передачи любых файлов в любом направлении
  • FTP НЕ предназначен для передачи гипертекстовых страниц

Как добиться загрузки больших файлов?

Однозначного алгоритма, позволившего бы Вам увеличить объём загружаемых файлов нет, поскольку эти объёмы ограничиваются неопределённым набором используемых Вами программ неопределённым набором способов. Некоторые из этих программ и некоторые используемые ими способы ограничения объёмов файлов перечислены выше.

В первую очередь попробуйте увеличить значения настроек, ссылки на описание которых есть в разделе «Как может быть ограничен объём загружаемых файлов?».

Не забывайте, что настройки используемых Вами программ могут быть прописаны в большом количестве разных мест, при этом могут учитываться все настройки, с учётом приоритета мест.

Следует помнить, что max_execution_time и max_input_time могут быть одинаковыми на разных серверах, но на более быстром сервере за это время большой файл успеет загрузиться, а на медленном сервере (или на том же сервере, но в моменты пиковой загрузки, когда к серверу обращается много пользователей), при тех же настройках тот же файл уже не загрузится.

Встречались также случаи, когда на компьютере хранится несколько копий файлов настроек и программист меняет один из них, а сервер загружает другой. Часто меняют настройки и забывают после этого перезагрузить сервер.

Если не поможет изменение настроек – следуйте рекомендациям раздела «Кто может ограничивать объём загружаемых файлов?», то есть изучите все настройки (а не только описанные в этой статье) во всех используемых Вами программах. Можете начать с поиска всех настроек, в которых встречается слово upload или limit. Потом посмотрите все остальные.

Если и это Вам не поможет, значит, скорее всего где-то Вы допустили ошибку: либо неправильно прописали настройки, либо Ваши настройки переопределяются в каком-то другом месте, либо их изменение запрещено другими настройками, либо о каких-то настройках не прочитали.

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

Простое решение проблемы

Для загрузки больших файлов на сервер используйте FTP.

Решение, предложенное Кром.

На локальном компьютере ставится простейший ftp. На сервере прописываешь ip, логин и пароль. Если крона нет, то просто по обращению к странице на сервере проверяешь локальный ftp, закачиваешь файлы на серер, автоматически делаешь ссылки и т.д. Т.е. вообще без всякого вмешательства все работает.

Если понадобится описание файлов и какая-то дополнительная информация, то заходишь в админку и добавляешь необходимые данные. При этом на странице тебе выдается весь список закачанных файлов или тех, которые еще находятся на локальном ftp. Под ними поля для дополнительной информации, чекбоксы и т.д. Заполнил всё, нажал ОК и пошёл курить. Программа сама докачает необходимые файлы и выложит их в публичный доступ. Смотрите также

Полезные статьи по загрузке файлов на сервер

Upload файлов, и все с этим связанное

Программы, которые могут Вам помочь

File Upload Applet

Mega Upload Progress Bar

Благодарности

Кром. Способ загрузки больших файлов, если у Вашего локального компьютера есть выделенный IP и Вы сами закачиваете файлы на сервер.

Я хотел бы просто ограничить размер файла, который пользователь может загрузить.

Я думал maxlength = 20000 = 20k, но это, похоже, не работает вообще.

Я работаю на Rails, а не PHP, но думал, что было бы намного проще сделать это на стороне клиента в HTML/CSS или в крайнем случае с помощью jQuery. Это настолько просто, что должен быть какой-то HTML-тег, о котором я не знаю или не знаю.

глядя на поддержку IE7+, Chrome, FF3.6+. Я предположим, я мог бы уйти, просто поддерживая IE8+, если это необходимо.

вы не можете сделать это на стороне клиента. Вам придется сделать это на сервере.

Edit: этот ответ устарел!

как время этого редактирования, HTML-файл API является в основном поддерживается во всех основных браузерах.

Я бы предоставил обновление с решением, но @mark.Инман.победа уже сделал это.

имейте в виду, что даже если теперь можно проверить на клиенте, вы все равно должны проверить его на сервер, однако. Все проверки на стороне клиента можно обойти.

Это вполне возможно. использовать JavaScript.

Я использую jQuery для выбора входного элемента. Я настроил его с событием on change.

приведенный выше код сохраняет все имена файлов, которые я считаю достойными сохранения на странице отправки, до фактического отправки. Я добавляю "одобренные" файлы в val входного элемента с помощью jQuery, поэтому форма отправки отправит имена файлов, которые я хочу сохранить. Все файлы будут представлены, однако, теперь на серверная сторона, мы должны отфильтровать их. Я еще не написал никакого кода для этого, но используйте свое воображение. Я предполагаю, что это можно сделать с помощью цикла for и сопоставления имен, отправленных из поля ввода, и сопоставить их с переменной $_FILES(PHP Superglobal, извините, я не знаю Ruby file variable).

Я имею в виду, что вы можете делать проверки файлов перед отправкой. Я делаю это, а затем выводить его пользователю, прежде чем он / она отправляет форму, чтобы дать им знать, что они загрузка на мой сайт. Все, что не соответствует критериям, не отображается пользователю, и поэтому они должны знать, что слишком большие файлы не будут сохранены. Это должно работать во всех браузерах, потому что я не использую объект FormData.

этот пример должен работать нормально. Я установил его примерно на 2 МБ, 1 МБ в байтах составляет 1,048,576, поэтому вы можете умножить его на необходимый предел.

Изменить максимальный размер загружаемых файлов в Вордпресс очень просто. Сегодня мы пойдем немного дальше, и я покажу на конкретном примере, как его изменить для определенной группы пользователей.

Условия задачи следующие:

На сайте есть группа авторов, необходимо чтобы они могли загружать файлы размером не более 1 Mб. Это правило не должно касаться других групп пользователей: администраторов, редакторов, например. У них должны быть дефолтные серверные значения.

Ограничиваем размер загружаемых файлов для группы пользователей Вордпресс

Задача решается с помощью хука upload_size_limit, который традиционно размещаем в файле функций (functions.php) активной темы.

Но прежде, нам нужно определить роль текущего пользователя, для этого перед хуком создадим дополнительную функцию danilin_get_current_user_role(), с помощью которой будем проверять роль пользователя.

Задачу можно решить и без дополнительных функций, с помощью current_user_can(). Но в Кодексе Вордпресс есть замечание, в котором сказано, что вызов функции с именами ролей может работать некорректно.

Теперь непосредственно проверка и установка лимита.

В Вордпресс по умолчанию пять основных ролей.

  1. Администратор (administrator);
  2. Редактор (editor);
  3. Автор (author);
  4. Участник (contributor);
  5. Подписчик (subscriber).

Есть еще шестая роль суперадминистратора, которая используется в режиме мультисайт Вордпресс.

Лимит задается в байтах.

Кто забыл, напомню, что в одном мегабайте 1024 килобайт, а в одном килобайте 1024 байт, получается:

  • 1 Мб = 1024*1024 = 1 048 576 байт
  • 512 Кб = 512*1024 = 524 288 байт

Общие лимиты

В Вордпресс есть несколько способов задать дефолтный максимальный размер загружаемых файлов.

Functions.php

В файле functions.php активной темы.

PHP.ini

Создать в корне сайта файл php.ini

Htaccess

В корневом файле .htaccess, который тоже нужно создать, если он отсутствует.

1M — это 1 Мегабайт.

Делаю сайты на Вордпресс с 2008 года. Не просто сайты, а уникальные инструменты для решения сложных бизнес‑задач с оптимизацией и поддержкой.

Читайте также: