Большая заметка по языку PHP

PHP загрузка файлов на сервер (заметка №24 по PHP)

Загрузка файлов методом POST

<form enctype="multipart/form-data" action="__URL__" method="POST">
    <!-- Поле MAX_FILE_SIZE должно быть указано до поля загрузки файла -->
    <input type="hidden" name="MAX_FILE_SIZE" value="30000" />
    <!-- Название элемента input определяет имя в массиве $_FILES -->
    Отправить этот файл: <input name="userfile" type="file" />
    <input type="submit" value="Send File" />
</form>

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

Также следует убедиться, что в атрибутах формы вы указали enctype="multipart/form-data", в противном случае загрузка файлов на сервер выполняться не будет.

Глобальный массив $_FILES содержит всю информацию о загруженных файлах.

$_FILES['userfile']['name'] — Оригинальное имя файла на компьютере клиента.

$_FILES['userfile']['type'] — Mime-тип файла, в случае, если браузер предоставил такую информацию. Пример: «image/gif«. Этот mime-тип не проверяется в PHP, так что не полагайтесь на его значение без проверки.

$_FILES['userfile']['size'] — Размер в байтах принятого файла.

$_FILES['userfile']['tmp_name'] — Временное имя, с которым принятый файл был сохранен на сервере.

$_FILES['userfile']['error'] — Код ошибки, которая может возникнуть при загрузке файла.

Код ошибки:

  • UPLOAD_ERR_OK — Значение: 0; Ошибок не возникло, файл был успешно загружен на сервер.
  • UPLOAD_ERR_INI_SIZE — Значение: 1; Размер принятого файла превысил максимально допустимый размер, который задан директивой upload_max_filesize конфигурационного файла php.ini
  • UPLOAD_ERR_FORM_SIZE — Значение: 2; Размер загружаемого файла превысил значение MAX_FILE_SIZE, указанное в HTML-форме.
  • UPLOAD_ERR_PARTIAL — Значение: 3; Загружаемый файл был получен только частично.
  • UPLOAD_ERR_NO_FILE — Значение: 4; Файл не был загружен.
  • UPLOAD_ERR_NO_TMP_DIR — Значение: 6; Отсутствует временная папка. Добавлено в PHP 5.0.3.
  • UPLOAD_ERR_CANT_WRITE — Значение: 7; Не удалось записать файл на диск. Добавлено в PHP 5.1.0.
  • UPLOAD_ERR_EXTENSION — Значение: 8; PHP-расширение остановило загрузку файла. PHP не предоставляет способа определить какое расширение остановило загрузку файла; в этом может помочь просмотр списка загруженных расширений из phpinfo(). Добавлено в PHP 5.2.0.

По умолчанию принятые файлы сохраняются на сервере в стандартной временной папке до тех пор, пока не будет задана другая директория при помощи директивы upload_tmp_dir конфигурационного файла php.ini.

<?php
// В PHP 4.1.0 и более ранних версиях следует использовать $HTTP_POST_FILES
// вместо $_FILES.

$uploaddir = '/var/www/uploads/';
$uploadfile = $uploaddir . basename($_FILES['userfile']['name']);

echo '<pre>';
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
    echo "Файл корректен и был успешно загружен.\n";
} else {
    echo "Возможная атака с помощью файловой загрузки!\n";
}

echo 'Некоторая отладочная информация:';
print_r($_FILES);

print "</pre>";

?>

В случае, если при отправке формы файл выбран не был, PHP установит переменную $_FILES['userfile']['size'] значением 0, а переменную $_FILES['userfile']['tmp_name'] — пустой строкой. none.

По окончанию работы скрипта, в случае, если принятый файл не был переименован или перемещен, он будет автоматически удален из временной папки.

Пример загрузки массива файлов:

<form action="" method="post" enctype="multipart/form-data">
<p>Изображения:
<input type="file" name="pictures[]" />
<input type="file" name="pictures[]" />
<input type="file" name="pictures[]" />
<input type="submit" value="Отправить" />
</p>
</form>
<?php
foreach ($_FILES["pictures"]["error"] as $key => $error) {
    if ($error == UPLOAD_ERR_OK) {
        $tmp_name = $_FILES["pictures"]["tmp_name"][$key];
        // basename() может спасти от атак на файловую систему;
        // может понадобиться дополнительная проверка/очистка имени файла
        $name = basename($_FILES["pictures"]["name"][$key]);
        move_uploaded_file($tmp_name, "data/$name");
    }
}
?>

Директива upload_max_filesize в php.ini определяет максимальный размер загружаемого файла. Ограничение по умолчанию составляет 2 мегабайта.

memory_limit — ограничения памяти.

max_execution_time — значением, необходимое время работы скрипта.

Директива max_input_time указывает максимально допустимое время в секундах для получения входящих данных, в том числе и загружаемых файлов (по умолчанию в 60 секунд).

Директива post_max_size — для максимального значания передачи по POST.

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

Загрузка на сервер нескольких файлов

<form action="file-upload.php" method="post" enctype="multipart/form-data">
  Файлы:<br />
  <input name="userfile[]" type="file" /><br />
  <input name="userfile[]" type="file" /><br />
  <input type="submit" value="Отправить" />
</form>

В случае, если такая форма была отправлена, массивы $_FILES['userfile'], $_FILES['userfile']['name'], и $_FILES['userfile']['size'] будут инициализированы.

Например, предположим, что были загружены файлы /home/test/review.html и /home/test/xwp.out. В таком случае переменная $_FILES['userfile']['name'][0] будет установлена значением review.html, а переменная $_FILES['userfile']['name'][1] — значением xwp.out. Аналогично, переменная $_FILES['userfile']['size'][0] будет содержать размер файла review.html и так далее.



www.000webhost.com