Загрузка файлов на сервер
Пример формы:
Форма отправит файл только методом POST и с атрибутом enctype="multipart/form-data".
<form action="/upload.php" method="post" enctype="multipart/form-data"> <input type="file" name="file"> <input type="submit" value="Отправить"> </form>
Форма для загрузки сразу нескольких файлов:
<form action="/upload.php" method="post" enctype="multipart/form-data"> <input type="file" name="file[]" multiple> <input type="submit" value="Отправить"> </form>
Файл upload.php:
- Поддерживает как одиночную загрузку файла так и множественную (multiple) без изменения кода.
- Проверка на все возможные ошибки которые могут возникнуть при загрузке файлов.
- Имена файлов переводятся в транслит и удаляются символы которые будут в дальнейшем мешать вывести их на сайте.
- Есть возможность указать разрешенные и запрещенные для загрузки расширения файлов.
// Название <input type="file"> $input_name = 'file'; // Разрешенные расширения файлов. $allow = array(); // Запрещенные расширения файлов. $deny = array( 'phtml', 'php', 'php3', 'php4', 'php5', 'php6', 'php7', 'phps', 'cgi', 'pl', 'asp', 'aspx', 'shtml', 'shtm', 'htaccess', 'htpasswd', 'ini', 'log', 'sh', 'js', 'html', 'htm', 'css', 'sql', 'spl', 'scgi', 'fcgi' ); // Директория куда будут загружаться файлы. $path = __DIR__ . '/uploads/'; if (isset($_FILES[$input_name])) { // Проверим директорию для загрузки. if (!is_dir($path)) { mkdir($path, 0777, true); } // Преобразуем массив $_FILES в удобный вид для перебора в foreach. $files = array(); $diff = count($_FILES[$input_name]) - count($_FILES[$input_name], COUNT_RECURSIVE); if ($diff == 0) { $files = array($_FILES[$input_name]); } else { foreach($_FILES[$input_name] as $k => $l) { foreach($l as $i => $v) { $files[$i][$k] = $v; } } } foreach ($files as $file) { $error = $success = ''; // Проверим на ошибки загрузки. if (!empty($file['error']) || empty($file['tmp_name'])) { switch (@$file['error']) { case 1: case 2: $error = 'Превышен размер загружаемого файла.'; break; case 3: $error = 'Файл был получен только частично.'; break; case 4: $error = 'Файл не был загружен.'; break; case 6: $error = 'Файл не загружен - отсутствует временная директория.'; break; case 7: $error = 'Не удалось записать файл на диск.'; break; case 8: $error = 'PHP-расширение остановило загрузку файла.'; break; case 9: $error = 'Файл не был загружен - директория не существует.'; break; case 10: $error = 'Превышен максимально допустимый размер файла.'; break; case 11: $error = 'Данный тип файла запрещен.'; break; case 12: $error = 'Ошибка при копировании файла.'; break; default: $error = 'Файл не был загружен - неизвестная ошибка.'; break; } } elseif ($file['tmp_name'] == 'none' || !is_uploaded_file($file['tmp_name'])) { $error = 'Не удалось загрузить файл.'; } else { // Оставляем в имени файла только буквы, цифры и некоторые символы. $pattern = "[^a-zа-яё0-9,~!@#%^-_$?(){}[].]"; $name = mb_eregi_replace($pattern, '-', $file['name']); $name = mb_ereg_replace('[-]+', '-', $name); // Т.к. есть проблема с кириллицей в названиях файлов (файлы становятся недоступны). // Сделаем их транслит: $converter = array( 'а' => 'a', 'б' => 'b', 'в' => 'v', 'г' => 'g', 'д' => 'd', 'е' => 'e', 'ё' => 'e', 'ж' => 'zh', 'з' => 'z', 'и' => 'i', 'й' => 'y', 'к' => 'k', 'л' => 'l', 'м' => 'm', 'н' => 'n', 'о' => 'o', 'п' => 'p', 'р' => 'r', 'с' => 's', 'т' => 't', 'у' => 'u', 'ф' => 'f', 'х' => 'h', 'ц' => 'c', 'ч' => 'ch', 'ш' => 'sh', 'щ' => 'sch', 'ь' => '', 'ы' => 'y', 'ъ' => '', 'э' => 'e', 'ю' => 'yu', 'я' => 'ya', 'А' => 'A', 'Б' => 'B', 'В' => 'V', 'Г' => 'G', 'Д' => 'D', 'Е' => 'E', 'Ё' => 'E', 'Ж' => 'Zh', 'З' => 'Z', 'И' => 'I', 'Й' => 'Y', 'К' => 'K', 'Л' => 'L', 'М' => 'M', 'Н' => 'N', 'О' => 'O', 'П' => 'P', 'Р' => 'R', 'С' => 'S', 'Т' => 'T', 'У' => 'U', 'Ф' => 'F', 'Х' => 'H', 'Ц' => 'C', 'Ч' => 'Ch', 'Ш' => 'Sh', 'Щ' => 'Sch', 'Ь' => '', 'Ы' => 'Y', 'Ъ' => '', 'Э' => 'E', 'Ю' => 'Yu', 'Я' => 'Ya', ); $name = strtr($name, $converter); $parts = pathinfo($name); if (empty($name) || empty($parts['extension'])) { $error = 'Недопустимое тип файла'; } elseif (!empty($allow) && !in_array(strtolower($parts['extension']), $allow)) { $error = 'Недопустимый тип файла'; } elseif (!empty($deny) && in_array(strtolower($parts['extension']), $deny)) { $error = 'Недопустимый тип файла'; } else { // Чтобы не затереть файл с таким же названием, добавим префикс. $i = 0; $prefix = ''; while (is_file($path . $parts['filename'] . $prefix . '.' . $parts['extension'])) { $prefix = '(' . ++$i . ')'; } $name = $parts['filename'] . $prefix . '.' . $parts['extension']; // Перемещаем файл в директорию. if (move_uploaded_file($file['tmp_name'], $path . $name)) { // Далее можно сохранить название файла в БД и т.п. $success = 'Файл «' . $name . '» успешно загружен.'; } else { $error = 'Не удалось загрузить файл.'; } } } // Выводим сообщение о результате загрузки. if (!empty($success)) { echo '<p>' . $success . '</p>'; } else { echo '<p>' . $error . '</p>'; } } }
Загрузка файлов через AJAX
Содержание
- 1 Загрузка файлов через AJAX
- 2 Возможные проблемы
- 3 Требования перед загрузкой файлов
- 4 Этапы загрузки файла на сервер
- 5 Добавляем HTML форму для загрузки файла
- 6 Переходим на сервере и работаем с PHP
- 7 Вопросы безопасности
- 8 Подводим итоги и делаем выводы
- 9 Простая загрузка файла на сервер при помощи PHP
- 10 Загрузка файлов на сервер на php. Введение
- 11 Загрузка файлов в php. Код
- 12 HTML-форма для отправки файла
- 13 Массив $_FILES
- 14 Функция move_uploaded_file
- 15 Функция is_uploaded_file
- 16 Ограничиваем размер файла
- 17 Настройки php.ini для загрузки файлов на сервер
Файлы можно отправить без перезагрузки страницы с помощью jQuery Form Plugin.
Как это работает:
- На поле выбора файла с id="js-file" повешено jquery событие change.
- При выборе файла срабатывает событие и выполняется метод плагина ajaxSubmit, он все поля из формы с id="js-form" включая выбранный файл отправляет на uploads.php.
- Далее то что отдаст uploads.php выведется в <div id="result">…</div>.
- После завершения, форма очищается методом reset() т.к. input file останется с выбранным файлом.
<form id="js-form" method="post" enctype="multipart/form-data"> <input id="js-file" type="file" name="file[]" multiple> </form> <div id="result"> <!-- Сюда выводится результат из uploads.php --> </div> <script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <script src="//malsup.github.io/min/jquery.form.min.js"></script> <script> $('#js-file').change(function() { $('#js-form').ajaxSubmit({ type: 'POST', url: '/upload.php', target: '#result', success: function() { // После загрузки файла очистим форму. $('#js-form')[0].reset(); } }); }); </script>
Возможные проблемы
- На unix хостингах php функция move_uploaded_file() не будут перемещать файлы в директорию если у нее права меньше 777.
- Загрузка файлов может быть отключена в настройках PHP директивой file_uploads.
- Не загружаются файлы большого размера, причина в ограничениях хостинга.
Посмотрите в phpinfo() значения директив:- upload_max_filesize – максимальный размер закачиваемого файла.
- max_file_uploads – максимальное количество одновременно закачиваемых файлов.
- post_max_size – максимально допустимый размер данных, отправляемых методом POST, его значение должно быть больше upload_max_filesize.
- memory_limit – значение должно быть больше чем post_max_size.
snipp.ru
Требования перед загрузкой файлов
Обработка загружаемых файлов — стандартный процесс, но существует несколько мелочей, на которые необходимо обратить внимание перед началом работы. Первое, в чем нужно удостовериться, что PHP настроен и позволяет загружать файлы. Для этого в php.ini стоит проверить директиву file_uploads
, и, если она выключена, то включить.
file_uploads = On
Загружаемые файлы сначала сохраняются во временном каталоге (но не волнуйтесь … ваш PHP-скрипт впоследствии может переместить файлы в более подходящее место). Исходное местоположение является временным каталогом для системы по умолчанию. Вы можете указать другой каталог, используя директиву upload_tmp_dir
в php.ini. Независимо от этого, будет не лишним проверить, что процесс PHP имеет правильные права на запись в зависимости от используемого каталога.
upload_tmp_dir = "/tmp" tboronczyk@zarkov:~$ ls -l / | grep tmp drwxrwxrwt 13 root root 40960 2011-08-31 00:50 tmp
После того, как вы уверены, что конфигурация позволяет серверу принимать загруженные файлы, вы можете сосредоточить свое внимание на деталях и добавить HTML форму. Крайне важно, чтобы ваш элемент <form>
использовал метод POST и имел атрибут enctype
, установленный для multipart/form-data
.
<form action="upload.php" method="post" enctype="multipart/form-data">
Этапы загрузки файла на сервер
Скорей всего, вы уже можете представить, как загружаются файлы на сервер, основываясь на собственном опыте и требованиях о которых я упомянул выше.
- Посетитель просматривает HTML-страницу с формой, специально написанной для поддержки загрузки файлов;
- Далее он предоставляет файл, который он хочет загрузить и нажимает кнопку отправить;
- Браузер кодирует файл и отправляет его как часть запроса POST;
- PHP получает форму отправки, декодирует файл и сохраняет его во временном месте на сервере;
- Написанный PHP-скрипт, ответственный за обработку сообщения формы, проверяет файл и обрабатывает его каким-то образом, часто перемещая его из своего временного местоположения в постоянное, где будет храниться файл.
Для добавления поддержки загрузки файлов вам необходимо создать HTML форму, которая будет представлена пользователю, и скрипт PHP, который позаботится о загруженном файле на сервере.
Добавляем HTML форму для загрузки файла
HTML-формы предоставляют собой интерфейс, через который пользователь инициирует загрузку файла. Нужно помнить, что элемент <form>
должен иметь свой атрибут метода, установленный для публикации, и его атрибут enctype
, заданный для multipart/form-data
. Элемент <input>
файла предоставляет поле, используемое для указания файла, который будет загружен. Как и любой другой элемент формы, важно указать атрибут имени, чтобы вы могли ссылаться на него в PHP скрипте, обрабатывающем форму.
Вот как выглядит типичная разметка формы загрузки файлов:
<form action="upload.php" method="post" enctype="multipart/form-data"> <input type="file" name="myFile"> <br> <input type="submit" value="Upload"> </form>
Стоит отметить, что разные браузеры будут визуализировать поле загрузки файла по-разному. IE, Firefox и Opera отображают его как текстовое поле с кнопкой рядом с ней надписью «Обзор» или «Выбрать». Safari отображает ее так же, как кнопку с надписью: «Выбрать файл». По большому счету это не проблема с тех пор, как пользователи привыкли к тому, как поле отображается в своем браузере и умеют его использовать. Иногда, однако, вы столкнетесь с клиентом или дизайнером, который непреклонно представляет его определенным образом. Количество CSS и JavaScript, которые могут применяться к файловому полю, крайне ограничено из-за соображений о безопасности, наложенных браузерами. Типизация файла может быть затруднена. Если внешний вид очень важен для вас, я рекомендую вам прочитать одну из статей «Питер-Пол Кох» типа ввода = «файл».
Переходим на сервере и работаем с PHP
Информация о загрузке файла предоставляется с помощью многомерного массива $_FILES
. Этот массив обладает своей структурой, назначенными именами для полей файла в форме HTML, точно так же, как и при работе с $_GET
и $_POST
. Затем массив каждого файла содержит следующие элементы:
$_FILES["myFile"]["name"]
— хранит исходное имя файла;$_FILES["myFile"]["type"]
— сохраняет mime-типа файла;$_FILES["myFile"]["size"]
— сохраняет размер файла (в байтах);$_FILES["myFile"]["tmp_name"]
— хранит имя временного файла;$_FILES["myFile"]["error"]
— хранит код ошибки, полученный в результате передачи.
При помощи функции move_uploaded_file()
мы можем перенести файл из своего временного каталога в постоянное место. Так же хорошей практикой является использовать именно её вместо copy()
и rename()
для этой цели, поскольку она выполняет дополнительные проверки, чтобы гарантировать, что файл был действительно загружен запросом HTTP методом POST.
Если вы собираетесь сохранить файл с исходным именем, предоставленным пользователем, рекомендуется убедиться, что это безопасно. Имя файла не должно содержать символов, которые могут повлиять на путь назначения, например, косая черта (слэш). Имя файла должно быть уникальным, чтоб избежать затирания существующих с тем же именем (если это не предусматривается вашим приложением). Гарантировать это можно заменяя любые символы символом подчеркивания, который не является буквой, а затем добавляя увеличивающийся номер, если файл с таким именем уже существует.
Вот так как выглядит получение и обработка загрузки файла при помощи PHP:
define("UPLOAD_DIR", "/srv/www/uploads/"); if (!empty($_FILES["myFile"])) { $myFile = $_FILES["myFile"]; if ($myFile["error"] !== UPLOAD_ERR_OK) { echo "<p>Произошла ошибка.</p>"; exit; } // обеспечиваем безопасное имени файла $name = preg_replace("/[^A-Z0-9._-]/i", "_", $myFile["name"]); // не перезаписываем существующий файл $i = 0; $parts = pathinfo($name); while (file_exists(UPLOAD_DIR . $name)) { $i++; $name = $parts["filename"] . "-" . $i . "." . $parts["extension"]; } // сохраняем файл из временного каталога $success = move_uploaded_file($myFile["tmp_name"], UPLOAD_DIR . $name); if (!$success) { echo "<p>Не удалось сохранить файл.</p>"; exit; } // устанавливаем правильные права для нового файла chmod(UPLOAD_DIR . $name, 0644); }
Сначала мы удостоверяемся, что PHP загрузка файла на сервер прошла без ошибок. Затем определяем безопасное имя файла, как я только что описал выше, а затем перемещаем файл в его конечный каталог с помощью move_uploaded_file()
. И наконец делаем вызов chmod()
, чтобы убедиться, что в новом файле установлены необходимые права доступа.
Вопросы безопасности
Вы бы позволили совершенно незнакомым людям хранить файлы на наших персональных компьютерах? Не думаю так, и все же это именно то, что вы делаете, когда разрешаете загрузку файлов в вашем приложении. Вы можете намереваться загрузить изображение пользователя для страницы профиля, но что, если он попытается загрузить специально созданный, наполненный вирусами исполняемый файл? Я хотел бы поделиться несколькими шагами, которые вы можете предпринять, чтобы минимизировать риски безопасности, связанные с возможностью загрузки файлов.
Один из них заключается в том, чтобы проверить тип загружаемого файла, каким он должен быть. Опираться на значение $_FILES["myFile"]["type"]
или на расширение имени файла не является безопасным, поскольку оба могут легко подделываться. Скорее, используйте функцию exif_imagetype()
, чтобы проверить содержимое файла и определить, действительно ли это GIF, JPEG или один из нескольких других поддерживаемых форматов изображений. Если exif_imagetype()
недоступен (функция требует, чтобы расширение Exif было включено), вы можете использовать getimagesize()
. Массив, возвращаемый ей, будет содержать тип изображения, если он распознан.
// проверяем файл GIF, JPEG или PNG $fileType = exif_imagetype($_FILES["myFile"]["tmp_name"]); $allowed = array(IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG); if (!in_array($fileType, $allowed)) { // тип файла не разрешен ...
Для файлов без изображения вы можете использовать exec()
для вызова утилиты файлов unix. он определяет тип файла, ища известные двоичные подписи в ожидаемых местах.
// проверяем файл в формате PDF $mime = "application/pdf; charset=binary"; exec("file -bi " . $_FILES["myFile"]["tmp_name"], $out); if ($out[0] != $mime) { // файл не PDF ...
Еще один шаг, который вы можете предпринять, — наложить жесткие ограничения на общий размер запроса POST и количество файлов, которые можно загрузить. Для этого укажите соответствующее значение для директив upload_max_size
, post_max_size
и max_file_uploads
в php.ini. Директива upload_max_size указывает максимальный размер загрузки файла. В дополнение к размеру загрузки вы можете ограничить размер всего запроса POST директивой post_max_size
. max_file_uploads
— это новая директива (добавлена в версии 5.2.12), которая ограничивает количество загрузок файлов. Эти три директивы помогают защитить ваш сайт от атак, которые пытаются нарушить его доступность, вызывая интенсивный сетевой трафик или загрузку системы.
post_max_size = 8M upload_max_size = 2M max_file_uploads = 20
Третий шаг, который вы можете предпринять для минимизации риска, — это сканирование загруженных файлов с помощью антивирусного сканера. Это жизненно важно для защиты от распространённых вирусов и вредоносных программ, особенно если ваш сайт осуществляет файлообмен между разными людьми, как пример — вложения в веб-почтовый клиент или (юридический) сайт для обмена файлами. Существует расширение PHP, которое обеспечивает доступ к ClamAV, но, конечно, вы можете вызвать утилиту командной строки ClamAV так же, как я продемонстрировал для файла.
exec("clamscan --stdout " . $_FILES["myFile"]["tmp_name"], $out, $return); if ($return) { // файл заражен ...
Подводим итоги и делаем выводы
Сегодня вы узнали, как происходит настройка и осуществляется процесс PHP загрузки файлов на сервер с вашего сайта или веб-приложения. Чтобы загрузка была успешной, форма HTML должна быть отправлена через запрос POST с множественным форматированием данных, а PHP должен разрешать передачу, как указано, с помощью директивы file_uploads
. После переноса файла, сценарий, ответственный за обработку загрузки, использует информацию, найденную в массиве $_FILES
, чтобы переместить файл из временного каталога в нужное место. Я также поделился некоторыми дополнительными мерами предосторожности, которые вы можете предпринять, чтобы защитить себя и своих пользователей от некоторых рисков, связанных с возможностью загрузки файлов. Чтобы гарантировать свою безопасность — проверяйте тип файла, наложите жесткие ограничения на загрузку трафика и применяйте сканирование на наличие вирусов.
Для тех, кто может быть заинтересован, дополнительный код для этой статьи доступен на GitHub. Вы можете просматривать, загружать или клонировать репозиторий и играть с кодом, чтобы лучше понять, как работает процесс загрузки файлов.
falbar.ru
Простая загрузка файла на сервер при помощи PHP
Вам не составит труда написать собственный PHP-скрипт для загрузки файлов на сервер. Прежде всего, нужно создать HTML-форму с полем file input. Затем привязать к ней PHP-скрипт, который переместит файл в указанную директорию. Чтобы закачать файл на сервер с помощью PHP-скрипта, выполните следующие действия:
- Создайте простую HTML-форму: потребуется простая форма с возможностью указания файла. Она размещается в файле basic.php:
Приведенный выше код необходим для создания формы. Как только пользователь выбирает файл и нажимает кнопку Upload, форма передаст данные с помощью метода POST на этой же странице, так как в качестве обработчика указан файл basic.php:
Важно: не забудьте добавить enctype=”multipart/form-data” в тег <form>.
- Создаем PHP-скрипт для обработки формы загрузки. В PHP вся информация о загруженных файлах содержится в глобальной переменной $_FILES. То есть, используя $_FILES, можно проверить, был ли загружен файл. Если файл был загружен, то можно переместить его в нужную директорию при помощи функции move_uploaded_file PHP:
Приведенный выше код проверяет, загрузил ли пользователь файл. Если файл загружен, то мы перемещаем файл в указанную директорию. В приведенном выше скрипте мы перемещаем файл в ту же папку, где находится файл basic.php.
Ниже приведена полная версия PHP move uploaded file примера:
Пожалуйста, не тестируйте этот PHP move uploaded file пример на сервере. Он не отвечает требованиям безопасности, и был создан специально для того, чтобы наглядно показать, как загружать файлы с помощью PHP.
Вопрос: Почему приведенный выше скрипт небезопасен?
Ответ: С помощью скрипта, приведенного выше, можно загрузить файл любого типа на сервер. То есть, если вы используете скрипт в таком виде на “живом” сервере, то любой хакер сможет загрузить собственные PHP-скрипты, и взломать ваш сайт и сервер.
Чуть позже мы подробнее поговорим о защите скрипта для загрузки файлов на сервер.
Что такое $_FILES?
$_FILES – это глобальная переменная в PHP наподобие $_POST или $_GET. Она представляет собой ассоциативный массив, в котором находится информация о загруженном файле с помощью метода HTTP POST.
То есть, если выполнить print_r($_FILES) для приведенного выше скрипта, то мы получим следующую информацию:
То есть, для каждого поля <input type=”file” name=”inputfile“/> в массиве создается элемент. Если вы создадите <input type=”file” name=”test”>, то название элемента также будет изменено на test. Например:
Теперь для каждого input file, перемещаемого с помощью move uploaded file PHP, создается пять элементов (name, type, tmp_name, error, size). Давайте познакомимся с этими элементами поближе:
- name: содержит название загруженного пользователем файла. Если вы загрузите файл abc.txt в браузер, то элемент name получит название abc.txt;
- type: тип загруженного файла или mime-type, если точнее. Для файла JPG этот элемент будет иметь значение image/jpeg. Если загрузить текст, то элемент получит значение text/plain. Для разных типов файлов разным будет и mime-type. Ниже приведены самые распространенные mime-типы:
- JPEG: image/jpeg;
- PNG: image/png;
- Текст: text/plain;
- Word: application/msword.
- tmp_name: временное расположение для загруженного файла. Этот путь можно изменить в переменной upload_tmp_dir, указанной в файле php.ini.
- error: информация об ошибке. Включает в себя тип ошибки, возникшей в процессе загрузки. Например, когда размер файла превышает максимальный или когда не был указан файл для загрузки. Для любой возникшей ошибки имеется числовое значение и константа. Ниже приведен полный список ошибок, которые могут возникнуть в PHP move uploaded file примере:
- UPLOAD_ERR_OK (значение 0). Означает, что файл был успешно загружен без ошибок;
- UPLOAD_ERR_INI_SIZE (значение 1). Размер файла превышает указанный в переменной upload_max_filesize в файле php.ini;
- UPLOAD_ERR_FORM_SIZE (значение 2). Размер файла превышает установленное в переменной формы MAX_FILE_SIZE значение;
- UPLOAD_ERR_PARTIAL (значение 3). Файл загружен не полностью;
- UPLOAD_ERR_NO_FILE (значение 4). Отсутствует файл для загрузки;
- UPLOAD_ERR_NO_TMP_DIR (значение 6). Указанной директории для временного хранения не существует;
- UPLOAD_ERR_CANT_WRITE (значение 7). Невозможно записать файл на диск.
- size: размер загруженного файла в байтах.
Что такое move_uploaded_file?
move_uploaded_file представляет собой функцию, которая перемещает загруженный файл из временной директории в папку назначения. Перед перемещением move_uploaded_file PHP проверяет, был ли загружен файл, указанный в HTTP-методе post.
Если файл был успешно перемещен, то вы получите ответ true или false. В первом примере мы использовали следующую строку кода:
А теперь давайте сделаем красиво, и выведем информацию:
Изменяем лимит размера загружаемого файла
У каждой формы для загрузки файлов должен быть установлен лимит размера, иначе пользователи станут загружать увесистые файлы. Выставить ограничение на move uploaded file PHP можно двумя способами:
- В файле PHP.ini есть специальная переменная upload_max_filesize, которая отвечает за максимальный размер загружаемых файлов. Далее приведена строчка из php.ini, которая ограничивает размер загружаемых файлов до 20 Мб: upload_max_filesize = 20M.
- Если загружаемый файл будет иметь больший размер, то пользователь получит ошибку UPLOAD_ERR_INI_SIZE или значение «2» в переменной $_FILES. Важно учесть, что значение переменной upload_max_filesize не должно превышать значение переменной post_max_size, указанной в php.ini;
- Ограничить размер загружаемого файла можно, поместив скрытый элемент ввода с названием UPLOAD_ERR_INI_SIZE в форму загрузки. Сделать это можно так: <input type="hidden" name="MAX_FILE_SIZE" value="50000" />.
Если нужно сильно увеличить filesize, то не забудьте изменить время исполнения php-скриптов.
Как обезопасить PHP-скрипт загрузки файлов
Теперь вы умеете ограничивать размер загружаемых файлов и знаете, как определить типы файлов, которые загружают пользователи. Пришло время позаботиться о безопасности нашего PHP move uploaded file примера.
В качестве примера сделаем так, чтобы пользователи не могли загружать jpeg-файлы размером свыше 1 Мб. Установите соответствующее ограничение в переменной upload_max_filesize файла php.ini. Ниже приведена улучшенная версия скрипта:
Мультизагрузка файлов при помощи PHP-скрипта
Можно загружать сразу несколько файлов при помощи $_FILES и move_uploaded_file PHP. Ниже я расскажу вам о двух способах мультизагрузки файлов с помощью PHP-скрипта:
- Используя разные имена Input.
- Используя одно и то же имя input, но с привлечением массива.
1. Используя разные имена Input:
Можно загружать сразу несколько файлов, используя несколько элементов ввода. Как уже говорилось ранее, если мы создаем несколько элементов input, то в $_FILES будет создано несколько основных элементов. Например, для приведенной ниже формы:
$_FILES представит массив следующего содержания:
Приведенный ниже PHP move uploaded file пример нужно писать с учетом того, что один элемент предназначен для аватарки (изображение), а другой – для загрузки резюме (файла в формате .doc):
2. Используем одно поле input, но с применением массива:
Как и в случае с другими типами input, для move uploaded file PHP мы можем использовать массив с input type, указанным в php. То есть:
То есть, для приведенного выше HTML, $_FILES предоставит данные со следующей структурой:
Скачать код, использованный в статье
Перевод статьи “File Upload With PHP Script” был подготовлен дружной командой проекта Сайтостроение от А до Я.
www.internet-technologies.ru
Наверняка, Вы часто загружали различные файлы на сайты. Например, загружали аватары на форуме, фотографии в социальных сетях, различные видеоролики на видеохостинги, просто файлы на файлообменники. И вот в этой статье Вы узнаете, как загрузить файлы на сервер в PHP. Именно через PHP в большинстве случаев это и реализуют.
Первым делом, что нужно усвоить — это то, что сама HTML-форма, в которую подставляется файл должна быть не совсем обычной, вот пример HTML-кода такой формы:
<form action = "loading.php" method = "post" enctype = 'multipart/form-data'>
<input type = "file" name = "somename" />
<input type = "submit" value = "Загрузить" />
</form>
Ключевой момент здесь — это атрибут «enctype» со значением «multipart/form-data«. Без него ничего работать не будет.
Теперь пишем скрипт «loading.php«, в котором мы ещё загружать файл не будем, а пройдёмся немного по различным важным моментам, которые надо обязательно учитывать, иначе может пострадать безопасность:
<?php
print_r($_FILES);
?>
В результате, Вы увидите содержимое глобального двумерного массива $_FILES:
- name — имя загружаемого файла.
- type — MIME-type загружаемого файла. Это, пожалуй, самый важный параметр для обеспечения безопасности. И всегда при приёме файлов необходимо проверять MIME-type, иначе проблем не оберётесь. В следующей статье мы поговорим об этом более детально.
- tmp_name — физический путь к временному файлу. Именно в это место и помещается файл, а уже потом мы его переносим в другое место. Фактически, файл уже загружен, а нам лишь надо его переместить в нужную папку на сервере.
- error — код ошибки. Если 0, то ошибок нет.
- size — размер загружаемого файла. Вот это тоже частоиспользуемая опция, и её также надо проверять, чтобы ограничить размер загружаемых файлов. Безусловно, самим сервером этот размер ограничен, однако, для всяких картинок, этот размер явно завышен (как правило, он 10 МБ).
И все эти параметры присутствуют для каждого загружаемого файла (каждые из которых представляют собой массив в двумерном массиве $_FILES).
Теперь давайте уже закончим с загрузкой файлов на сервер в PHP, и для этого напишем такой код («loading.php«):
<?php
$uploadfile = "images/".$_FILES['somename']['name'];
move_uploaded_file($_FILES['somename']['tmp_name'], $uploadfile);
?>
То есть вначале мы задаём путь к загружаемому файлу на сервере. Здесь мы хотим поместить файл в директорию «images» с тем же именем, что и было раньше у файла. А функцией move_uploaded_file() мы перемещаем файл в выбранную нами директорию из его временного хранилища.
Однако, обратите внимание, это очень важно! Так использовать код ни в коем случае нельзя, иначе Вашему сайту будет угрожать серьёзная опасность! Фактически, на данный момент может быть загружено абсолютно всё, что угодно: любые исполняемые файлы, скрипты, HTML-страницы и другие весьма опасные вещи. Поэтому обязательно надо проверять загружаемые файлы на сервер очень тщательно. И вот этим мы и займёмся в следующей статье. Поскольку тема очень важная, то я советую Вам подписаться на обновления, чтобы не пропустить эту статью.
myrusakov.ru
Загрузка файлов на сервер на php. Введение
В этой статье я хочу показать как можно быстро и просто реализовать загрузку файлов на сервер с помощью php с проверками файла на размер и на формат. Эта тема хоть и простая и очень распространенная, все же по ней тоже часто возникают вопросы у программистов новичков.
Чтобы передать какие-либо данные из браузера на сервер необходимо на странице создать html-форму:
<form action="/form/index.php" method="POST" enctype="multipart/form-data"> <input type="file" name="upload_file"><br> <input type="submit" value="Загрузить"><br> </form>
В которой будет указан путь к скрипту на сервере, куда будут отправлены данные, в данном случае это /form/index.php. Также указывается метод передачи данных — POST или GET. И необходимо указать тип передаваемых данных, чтобы передавать файлы, тип должен быть multipart/form-data.
Когда сама форма готова, внутри нее следует создать input и типом file, в него пользователь сможет загрузить файл, для последующей отправки на сервер.
Далее начинается самое интересное — получение и обработка данных на сервере. Все данные о файле будет храниться в суперглобальной переменной $_FILE. Поэтому первым делом на сервере необходимо проверить — существует эта переменная или нет. В случае существования, мы можем проверить размер файла, получить его имя, расширение и путь к нему, файл будет хранится во временных файлах.
Загрузка файлов в php. Код
Сперва сверстаем небольшую форму и добавим условия, при которых будет отображаться сообщения об успешной отправке файла или об случившихся ошибках:
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> </head> <body> <br/> <?php if(!empty($error_array)): ?> <span style="color: red;">Файл не загружен!</span><br/> <?php foreach($error_array as $one_error): ?> <span style="color: red;"><?=$one_error;?></span><br/> <?php endforeach; ?> <?php endif; ?> <?php if(empty($error_array) AND $_FILES): ?> <span style="color: green;">Файл успешно загружен!</span><br/> <?php endif; ?> <form action="/form/index.php" method="POST" enctype="multipart/form-data"> <input type="file" name="upload_file"><br> <input type="submit" value="Загрузить"><br> </form> </body> </html>
Теперь напишем серверный скрипт, который будет проверять размер и формат файла, а так же в случае корректных данных будет сохранять файл на сервере.
<?php // ограничение размера файла $limit_size = 1*1024*1024; // 1 Mb // корректные форматы файлов $valid_format = array("jpeg", "jpg", "gif", "png"); // хранилище ошибок $error_array = array(); // путь до нового файла $path_file = "files/"; // имя нового файла $rand_name = md5(time() . mt_rand(0, 9999)); // если есть отправленные файлы if($_FILES){ // валидация размера файла if($_FILES["upload_file"]["size"] > $limit_size){ $error_array[] = "Размер файла превышает допустимый!"; } // валидация формата файла $format = end(explode(".", $_FILES["upload_file"]["name"])); if(!in_array($format, $valid_format)){ $error_array[] = "Формат файла не допустимый!"; } // если не было ошибок if(empty($error_array)){ // проверяем загружен ли файл if(is_uploaded_file($_FILES["upload_file"]["tmp_name"])){ // сохраняем файл move_uploaded_file($_FILES["upload_file"]["tmp_name"], $path_file . $rand_name . ".$format"); }else{ // Если файл не загрузился $error_array[] = "Ошибка загрузки!"; } } } ?>
На этом все, исходники формы для загрузки файлов на php, вы можете скачать — тут.
vk-book.ru
HTML-форма для отправки файла
Первое, что нужно знать для загрузка файлов на сервер — это особенности HTML-форм, которые отправляют файл.
Вот пример HTML-кода такой формы:
<html> <head> <title>Загрузка файлов на сервер</title> </head> <body> <h2>Форма для загрузки файлов</h2> <!-- Поле MAX_FILE_SIZE должно быть указано до поля загрузки файла --> <input type="hidden" name="MAX_FILE_SIZE" value="30000"> <form action="upload.php" method="post" enctype="multipart/form-data"> <input type="file" name="filename"><br> <input type="submit" value="Загрузить"><br> </form> </body> </html>
Что уникального в этой форме:
- Тег
form
должен обязательно содержать атрибутenctype="multipart/form-data
. Именноо этот атрибут указывает на то, что форма будет передавать файл. По умолчанию атрибутenctype
имеет значениеapplication/x-www-form-urlencoded
. - Форма должна содержать скрытый атрибут (
type="hidden"
) с именемMAX_FILE_SIZE
в значении которого (value
) указывается размер файла. Теоретически, браузеры должны сообщать о том, что файл превышает допустимые размеры, но на практике браузеры не поддерживают это. Я думаю, что этот атрибут можно не указывать. - Для выбора передаваемого файла служит тег
input
, у которого атрибутtype="file"
.
После того, как сервер получил HTTP-запрос от такой формы, он записывает файл во временную папку на сервере.
Если хотите чтобы файл на этом этапе сохранялся в другой каталог, укажите его в директиве upload_tmp_dir
файла php.ini.
Для перемещения загруженного файла в новое место используется функция move_uploaded_file
.
Но перед тем, как начать работать с этой функцией, мы должны изучить двумерный массив $_FILES
, через который мы получаем доступ к характеристикам загруженного файла.
Массив $_FILES
Итак, после того, как скрипт получил данные формы с переданным файлом, файл он записал в специальную папку, а данные о файле записал в двумерный массив $_FILES
.
Давайте рассмотрим пример, который выводит содержимое массива $_FILES
на экран.
<html> <head> <title>Загрузка файлов на сервер</title> </head> <body> <?php if ( ! $_FILES ) { echo ' <h2>Форма для загрузки файлов</h2> <form action="" method="post" enctype="multipart/form-data"> <input type="file" name="filename"><br> <input type="submit" value="Загрузить"><br> </form> '; } else { echo "<pre>", print_r($_FILES), "</pre>"; } ?> </body> </html>
Вот что мы получим в результате работы этого скрипта:
Теперь давайте разберём, что содержится в этом массиве.
В нашем двумерном массиве $_FILES
есть один элемент filename
. Это значение поля name
из элемента формы:
<input type="file" name="filename">
Данные для этого файла:
$_FILES['filename']['name']
— имя файла;$_FILES['filename']['type']
— тип файла;$_FILES['filename']['tmp_name']
— полный путь к временному каталогу на диске;$_FILES['filename']['error']
— содержит код ошибки, который это 0, если операция прошла успешно;$_FILES['filename']['size']
— размер файла.
Можно было бы в форме указать два поля для файлов, например так:
<input type="file" name="filename-1">
<input type="file" name="filename-2">
В этом случае наш массив выглядел бы так:
Итак, теперь мы знаем как устроен массив $_FILES
и следующий шаг — положить полученный файл в нужное нам место.
Функция move_uploaded_file
Как я уже писал, для перемещения загруженного файла в новое место используется функция move_uploaded_file
.
Синтаксис функции move_uploaded_file
:
move_uploaded_file ( откуда переносить , куда переносить )
Функция move_uploaded_file
возвращает булево значение:
TRUE
— в случае успеха,FALSE
— если первый аргумент является загруженным файлом, но по каким-либо причинам не может быть перемещён в указанное место, в этом случае никаких действий не предпринимается.
Используем эту функцию в примере:
<html> <head> <title>Загрузка файлов на сервер</title> </head> <body> <?php if ( ! $_FILES ) { echo ' <h2>Форма для загрузки файлов</h2> <form action="" method="post" enctype="multipart/form-data"> <input type="file" name="filename"><br> <input type="submit" value="Загрузить"><br> </form> '; } else { move_uploaded_file ( $_FILES["filename"]["tmp_name"], __DIR__ . DIRECTORY_SEPARATOR . $_FILES["filename"]["name"] ); } ?> </body> </html>
Этот скрипт перемещает картинку в ту же папку, в которой он сам находится. Для этого мы используем встроенные в PHP константы для указания пути:
__DIR__
— одна из «волшебных» констант, содержит директорию файла.DIRECTORY_SEPARATOR
— предопределённая константа, содержащая разделитель пути. Для ОС Windows это «», для ОС Linux и остальных — «/».
Внимание: Если результирующий файл уже существует, он будет перезаписан.
Функция is_uploaded_file
Ест ещё одна функция, которую нужно обязательно использовать при работе с загрузкой файлов на сервер. Это функция is_uploaded_file
и она используется из соображений безопасности.
is_uploaded_file
— определяет, был ли файл загружен при помощи HTTP POST и возвращает TRUE, если это так.
Использование этой функции целесообразно для удостоверения, что злонамеренный пользователь не пытается обмануть скрипт так, чтобы он работал с файлами, с которыми работать не должен — к примеру, /etc/passwd
.
Обратите внимание: для правильной работы функции is_uploaded_file
нужно передать путь к файлу на временном хранилище на сервере, то есть аргумент вида $_FILES['filename']['tmp_name']
, — а вот имя закачиваемого файла на клиентской машине ($_FILES['filename']['name']
) тут не подходит.
Наш конечный пример скрипта, обрабатывающего форму отправки файла, будет выглядеть так:
<html> <head> <title>Загрузка файлов на сервер</title> </head> <body> <?php if ( ! $_FILES ) { echo ' <h2>Форма для загрузки файлов</h2> <form action="" method="post" enctype="multipart/form-data"> <input type="file" name="filename"><br> <input type="submit" value="Загрузить"><br> </form> '; } else { // Проверяем загружен ли файл if( is_uploaded_file($_FILES["filename"]["tmp_name"]) ) { // Если файл загружен успешно, перемещаем его // из временной директории в конечную move_uploaded_file ( $_FILES["filename"]["tmp_name"], __DIR__ . DIRECTORY_SEPARATOR . $_FILES["filename"]["name"] ); } else { echo("Ошибка загрузки файла"); } } ?> </body> </html>
Ограничиваем размер файла
В некоторых случаях требуется ограничить размер файла, который может быть загружен на сервер. К примеру, чтобы разрешить загрузку на сервер только файлов с размером не более 3 Мбайт, в приведенном скрипте содержится код:
<?php ... if($_FILES["filename"]["size"] > 1024*3*1024) { echo("Размер файла превышает три мегабайта"); exit; } ... ?>
Максимальный размер загружаемого файла можно также задать при помощи директивы upload_max_filesize
в файле в php.ini. Значение этой которой директивы по умолчанию равно 2 Мбайт:
<?php ... // получаем значеие директивы upload_max_filesize при помощи функции ini_get $upload_max_filesize = (integer) ini_get( upload_max_filesize ); // перевобим бегабайты в байты $upload_max_filesize = $upload_max_filesize * 1024 * 1 024; if( $_FILES["filename"]["size"] > $upload_max_filesize ) ... ?>
Кстати, тут мы использовали временное преобразование типа переменной. Речь о круглых скобках с типом (integer)
. Подробнее об это читайте в статье «Работа с данными в PHP».
Настройки php.ini для загрузки файлов на сервер
Итак, мы узнали про директиву upload_max_filesize
файла php.ini которая устанавливает максимальный размер загружаемого файла. Какие ещё директивы файла php.ini отвечают за загрузку файлов на сервер?
Кстати, если Вы хотите узнать, где расположен Ваш файл php.ini, выполните скриптик:
<?php phpinfo(); ?>
Итак, список директив файла php.ini:
file_uploads
— возможность запретить или разрешить загрузку файлов на сервер в целом, по умолчанию разрешена (значение On).post_max_size
— общее ограничение сверху на размер данных, передаваемых в POST запросе. Если Вам необходимо передавать несколько файлов одновременно, или работать с большими файлами, измените значение этой директивы. Значение по умолчанию 8Мб.upload_max_filesize
— уже рассмотренная нами директива. Не забывайте при необходимости также менятьpost_max_size
.upload_tmp_dir
— временная директория на сервере, в которую будут помещаться все загружаемые файлы.
Это всё, что я хотел сказать Вам по теме «Загрузка файлов на сервер в PHP».
komotoz.ru
Здравствуйте. Сегодня мы поговорим с Вами о том, как можно увеличить размер загружаемого файла в PHP. С такой проблемой сталкиваются многие, однако они и не догадываются, как же все-таки ее правильно решить… Ниже Вы можете скачать исходные файлы, необходимые для работы данного урока:
Большинство веб-серверов сформировано так, что пользователь сайта на этом сервере может загружать файлы размером только до 2MB. Так, если, например, пользователь хочет загрузить на сервер какой-нибудь архив с полезной программой размером в 15МВ, то его попытки будут напрасны, файл не загрузится. К счастью, уже довольно давненько появился один метод решения этой проблемы, и многие уже успешно им воспользовались. Я как раз и хочу рассказать Вам о нем.
Ниже я по пунктам расскажу все то, что Вам очень пригодится для увеличения размера загружаемого файла:
- В корне своего веб-сервера создайте файл .htaccess;
- Откройте файл .htaccess и вставьте в него следующий код:
php_value upload_max_filesize 20M php_value post_max_size 20M php_value max_execution_time 200 php_value max_input_time 200
Расскажу поподробнее об этих четырех параметрах, которые мы использовали выше. Первый — содержит максимальный размер файла загрузки на сервер, второй параметр отвечает за наибольший размер отправляемых данных, третий за максимальное время выполнение скриптов и четвертый — за максимальное время приема данных на сервер.
Судя по вышеприведенному коду становится теперь понятно, что максимальный размер загрузки файла на сервер равен 20МВ и файл который мы закачиваем должен успеть закачаться за 200 секунд, если же этого не происходит, то файл не закачивается, из этого следует вывод об увеличении данного параметра. Также Вы можете изменить максимальный размер загрузки файла до бесконечности, именно столько, сколько Вам потребуется.
На этом мой урок подошел к концу. Думаю, что Вам очень пригодится этот материал. Если что-нибудь будет непонятно — пишите в комментариях, я все для Вас подробно объясню. До свидания.
ruseller.com
Что такое Upload files, или почему не работает
copy («c:imagessample.jpg», «http://mysite.ru/uploads/sample.jpg «)
Даже если у Вас в распоряжении всего один компьютер, на котором совмещен и сервер и рабочая станция, не стоит забывать о том, что php использует технологию клиент/сервер. Файл, который мы хотим загрузить, как правило, находится на машине клиента, т.е. пользователя, обыкновенного посетителя сайта. Место назначения — сервер. Для того чтобы совершить процесс передачи файла, нам понадобиться следующая форма:
<form enctype="multipart/form-data" action="/upload.php" method="post"> <input type="hidden" name="MAX_FILE_SIZE" value="30000"> Send this file: <input name="userfile" type="file"> <input type="submit" value="Send File"> </form>
При этом в поле action должен быть указан URL Вашего php-скрипта, который в дальнейшем будет заниматься обработкой загружаемых файлов. Скрытое поле MAX_FILE_SIZE должно предшествовать полю выбора файла, и содержать максимально допустимый размер файла в байтах. Его назначение — проверка размера файла еще до момента отправки файла на сервер. Это должно избавить пользователя от длительной и безрезультатной загрузки файла на сервер и образования лишнего трафика, но не стоит особо полагаться на это ограничение, так как его легко обойти.
Что происходит, когда пользователь выбрал файл на своем диске, и нажал на кнопку «Send file»? Браузер отсылает файл на сервер, где php-интерпретатор помещает его в свою временную директорию, присваивая ему случайное имя и выполняет скрипт, указанный в поле action.
Как должен выглядеть upload.php?
$uploaddir = '/var/www/uploads/'; if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploaddir. $_FILES['userfile']['name'])) { print "File is valid, and was successfully uploaded."; } else { print "There some errors!"; }
При написании скрипта, возникает естественный вопрос: как получить информацию о загруженном файле и достучаться до самого файла. Если Вы используете PHP версии 4.1.0 и старше, лучше всего будет обратиться к глобальному массиву $_FILES. Для каждого загруженного файла он содержит хеш-массив, со следующими данными:
- $_FILES[‘userfile’][‘name’] — оригинальное имя файла, такое, каким его видел пользователь, выбирая файл;
- $_FILES[‘userfile’][‘type’] — mime/type файла, к примеру, может быть image/gif; это поле полезно сохранить, если Вы хотите предоставлять интерфейс для скачивания загруженных файлов;
- $_FILES[‘userfile’][‘size’] — размер загруженного файла;
- $_FILES[‘userfile’][‘tmp_name’] — полный путь к временному файлу на диске;
- $_FILES[‘userfile’][‘error’] — Начиная с версии 4.2.0, содержит код ошибки, который равен 0, если операция прошла успешно.
Для PHP версии ниже 4.1.0 этот массив называется $HTTP_POST_FILES. Не стоит забывать, что в отличие от $_FILES этот массив не является суперглобальным и при обращении к нему, к примеру, из функции, необходимо явно указывать global $HTTP_POST_FILES;
Если в настройках Вашего сервера register_globals=on, будут созданы дополнительные переменные вида $userfile_name, $userfile_type, $userfile_size… Учитывая, что, начиная с версии 4.2.0, в настройках по умолчанию register_globals=off использования этих переменных не рекомендовано, даже если они определены. Лучший способ получения информации о загружаемых файлах — использовать массив $_FILES.
Для работы с загруженными файлами лучше всего использовать встроенные функции is_uploaded_file() и move_uploaded_file(), которые проверяют, был ли загружен файл, и помещают его в указанную папку соответственно. Более детальную информацию Вы можете найти на страницах руководства. Не стоит изобретать велосипед и работать самому с временными файлами, копировать их, удалять. Это уже сделано до Вас и для Вас.
Я все сделал правильно, но у меня что-то не работает. Может, у меня неправильно сконфигурирован сервер?
Если Вы «все сделали правильно», но Ваш код неработает, или работает неправильно, не спешите отчаиваться. Возможно проблема не в Ваших руках, а в неверных настройках сервера. Вот список директив, которые имеют отношения к загрузке файлов:
В файле php.ini:
- Если Вы хотите узнать, где расположен Ваш php.ini, выполните
<?php phpinfo(); ?>
- file_uploads — возможность запретить или разрешить загрузку файлов в целом. По умолчанию On.
- upload_max_filesize — максимальный размер файла, который может быть загружен. Если Вам необходимо работать с большими файлами, измените эту настройку. По умолчанию 2М. Не забудьте изменить post_max_size.
- post_max_size — общее ограничение сверху на размер данных, передаваемых в POST запросе. Если Вам необходимо работать с большими файлами, или передавать несколько файлов одновременно, измените эту настройку. Значение по умолчанию 8М.
- upload_tmp_dir — временная директория на сервере, в которую будут помещаться все загружаемые файлы. Проверьте, какие на нее выставлены права(если на данном этапе у Вас возникли сложности, смотрите пояснения в конце статьи). Такая директория должна существовать и у пользователя, под которым выполняется Apache, также должны быть права на запись в эту директорию. Если Вы работаете с включенным ограничением open_basedir — то временный каталог должен находиться внутри. Вам не нужно заботиться о ее чистке или об уникальности имен, PHP решает эту проблему за Вас.
В файле httpd.conf:
- Прежде всего, убедитесь, что Вы используете веб-сервер Apache 1.3 (последняя версия на момент написания статьи — 1.3.27). Если Вы используете Apache 2.0, Вам следует прочитать следующий отрывок из документации:
Do not use Apache 2.0 and PHP in a production environment neither on Unix nor on Windows.
- Если Вы получили сообщение «POST Method Not Allowed», это означает, что надо искать что-то похожее на следующие директивы, и использовать ключевое слово Allow:
<Limit POST> Order allow,deny Allow from all </Limit>
- Проблемы с загрузкой бинарных файлов — классический вопрос «почему бьются файлы при upload». Вот способ решения, предложенный Димой Бородином (http://php.spb.ru): В директории, где лежит скрипт, делаем файл .htaccess, в котором пишем:
CharsetDisable On
В файл httpd.conf дописать строки:
<Location /> CharsetRecodeMultipartForms Off </Location>
Небольшие пояснения, к этому рецепту: вышеописанная проблема, когда загруженные на сервер архивы не распаковываются и картинки не отображаются, может возникать из-за того, что используется веб-сервер Russian Apache. Директива CharsetDisable отключает модуль charset-processing module, т.е. никакой перекодировки при скачивании файлов, находящихся в данной папке, происходить не будет. Директива CharsetRecodeMultipartForms выключает перекодировку данных, переданных методом POST с заголовком Content-Type: multipart/form-data. Т.е. двоичные данные, переданные с такой настройкой, будут оставлены в первоначальном виде, а все остальное наполнение сайта будет перекодировано согласно текущим настройкам сервера.
Но при этом могут возникнуть осложнения: будьте готовы к тому, что в некоторых случаях текстовые части запросов вам придется перекодировать самостоятельно. Вот что по этому поводу говорится в документации:
Используйте директиву CharsetRecodeMultipartForms, которая появилась в PL23, но при этом вам все-равно придется перекодировать вручную текстовые части запросов. Для этого можно использовать Russian Apache API, доступное в других модулях или Russian Apache Perl API, доступное из mod_perl.
Один из примеров определения кодировки вы можете найти тут: http://tony2001.phpclub.net/detect_charset/detect.phps
Самая свежая документация по Russian Apache находится на его официальном сайте: http://apache.lexa.ru/.
Не забывайте, что после любой смены конфигурации, Вам необходимо перезапустить Ваш веб-сервер.
Также возможна настройка параметров Apach с помощью .htaccess:
php_value upload_max_filesize 50M php_value post_max_size 50M
Загрузка нескольких файлов одновременно
Пример формы загрузки нескольких файлов:
<form action="upload.php" method="post" enctype="multipart/form-data"> Send these files:<br> <input name="userfile[]" type="file"><br> <input name="userfile[]" type="file"><br> <input type="submit" value="Send files"> </form>
И не забудьте увеличить post_max_size, если предполагается много файлов
Автоматическая загрузка файлов на сервер
Не стоит забывать, что файлы на диске пользователя — конфиденциальная информация, к которой ни JavaScript, ни уж тем более PHP не имеют ни малейшего отношения. До тех пор, пока пользователь сам не выбрал файл при помощи <input type=»file»> ни о какой работе с ним не может идти и речи. И не забывайте, что у данного поля ввода атрибут value защищен от записи.
Хранение файлов в базе данных mySQL
Если Вы собрались хранить загружаемы файлы в базе данных, Вам необходимо помнить следующие моменты:
- Необходимо использовать поле типа BLOB
- Перед тем, как класть в базу, не забыть применить к строке mysql_escape_string()
- При отображении файла необходимо указывать заголовок content/type
Помните, что скрипт отображающий ваш HTML никак не связан со скриптом, который должен выводить изображение. Это должны быть два различные приложения.
Хранение картинок в базе не является хорошем стилем. Гораздо удобней хранить в базе лишь пути к файлам изображений.
Получение свойств изображения.
Если перед вами возникла задача проверить тип или размеры картинки перед загрузкой файла на сервер, вам потребуется функция getimagesize(). В качестве аргумента она принимает имя файла на диске и возвращает массив, первые два элемента которого — ширина и высота соответственно, третий — тип изображения. В случае невозможности прочитать из указанного файла корректное изображение, функция возвращает ложь.
Загрузка файлов, имеющих русско-язычное название
При загрузке на сервер файлов, необходимо проверять их оригинальные имена на предмет наличия «нестандартных» символов (к примеру русских букв). В случае их присутствия необходимо произвести замену. Оригинальное имя файла можно найти в переменной $_FILES[‘userfile’][‘name’]. Как перекодировать русскоязычную строку в транслит можно можно найти в примерах PHP.
Отображения статуса загрузки (Progress bar)
Необходимо учитывать, что до полной загрузки файла, PHP не может оперировать ни размером файла, ни процентом его загрузки. Только когда файл уже находится на сервере PHP, то он получает возможность обращаться к информации. Если вам все-таки крайне необходимо реализовать такую возможность, воспользуйтесь Java-аплетом.
Проблемы с правами на сервере (upload_tmp_dir)
В Unix-подобных операционных системах каждой папке, файлу, ссылке выставлены соответствие права доступа. Они могут выглядеть как rwx-rw-r- или же как число 754.
Доступность файла или каталога зависят от идентификатора пользователя и идентификатора группы, в которую он входит. Режим в целом описывается в терминах трех последовательностей, по три буквы в каждой:
Владелец Группа Прочие (u) (g) (o) rwx rwx rwx
Здесь владелец, члены группы и все прочие пользователи обладают правами чтения файла, записи в него и его выполнения. Права — любая осмысленная комбинация следующих букв:
r Право на чтение. (4)
w Право на запись. (2)
x Право на выполнение (поиск в каталоге). (1)
Для того, что бы загрузка файлов на сервер работала корректно, необходимо реализовать один из двух вариантов
htmlweb.ru