Загрузить файл на сервер

Загрузить файлы на веб-сервер кодом PHP легко, но это не безопасно. Нужны дополнительные осторожности при загрузке файлов. В этом уроке мы рассмотрим как безопасно загрузить файлы на сервер.

Оглавление:
  1. Форма загрузки файла
  2. Правила для загрузки файла
  3. Обработчик данных веб-формы
  4. Удалить файлы из папки

Пример загрузки файла на сервер безопасный и довольно прост. Можно добавить новые условия и разрешить загружать изображения GIF и PNG, или любой другой вид файлов, которые Вы хотите. Если Вы не знакомы с PHP, этот пример может быть хорошим началом.

Форма загрузки файла

HTML форма для загрузки файла на сервер в качестве пользовательского интерфейса. Посмотрите на пример ниже, и сохраните этот код HTML в файл index.php.

<form enctype="multipart/form-data" action="upload.php" method="post"> <!--для сервера-->
    <input type="hidden" name="MAX_FILE_SIZE" value="1000000" /><!--максимально допустимый размер файла для загрузки в байтах-->
    Выбрать файл для загрузки: <input name="uploaded_file" type="file" /><!--файл для загрузки-->
    <input type="submit" value="Отправить" /><!--кнопка загрузки-->
</form>
к меню ↑

Правила для загрузки файла

Существуют несколько правил, которым нужно следовать при построении формы HTML.

  • Метод веб-формы должен быть POST.
  • Атрибут для веб-формы enctype="multipart/form-data". Он указывает какой тип передаётся на сервер.

без этих требований загрузка файла не будет работать.

Атрибут тега Input: type="file" применяется для выбора файла кнопкой “Обзор”

Следующее поле скрытое, с аргументом max_file_size. Некоторые браузеры читают значение этого поля, и не позволят пользователю загрузить файл больше чем указано value="1000000" (в байтах). Указанное значение для скрытого поля не должно быть больше чем установлено в вашей версии PHP. Узнать версию PHP можно набрав в адресной строке: http://ваш_домен/phpinfo.php.

Дальше, в файле php.ini есть параметр upload_max_filesize его значение по умолчанию 2 МБ. Но этот параметр не гарантирует, что для скрипта не будет передан файл большего размера. Опасность в том, что злоумышленник может отправить несколько больших файлов за один запрос и заполнить файловую систему, в которых PHP хранит декодированные файлы. Поэтому в директиве php.ini параметр post_max_size установите больше, чем указан для upload_max_filesize. Эта директива определит максимальный размер POST данных в одном запросе. Также убедитесь, что file_uploads в файле php.ini включен.

Параметр post_max_size в файле php.ini
Параметр post_max_size должен быть установлен больше чем upload_max_filesize
Параметр upload_max_filesize
Параметр upload_max_filesize его значение по умолчанию 2 МБ

После того как пользователь отправил выбранный файл на сервер, обработчик PHP в файле upload.php будет обрабатывать данные веб-формы.

к меню ↑

Обработчик данных веб-формы

После загрузки файла на сервер PHP создаст временную копию файла. Суперглобальный массив $_FILES будет содержать информацию о файле. Для обработки информации о файле есть пять данных.

  1. $_FILES["uploaded_file"]["name"] оригинальное название загруженного файла с компьютера пользователя.
  2. $_FILES["uploaded_file"]["type"] тип загружаемого файла.
  3. $_FILES["uploaded_file"]["size"] размер загружаемого файла в байтах.
  4. $_FILES["uploaded_file"]["tmp_name"] место, где файл будет сохранен на сервере.
  5. $_FILES["uploaded_file"]["error"] код ошибки при отправки файла.

Посмотрите на пример ниже, и сохраните этот код PHP в файл upload.php.

<?php
// проверяем, что есть файл
if((!empty($_FILES["uploaded_file"])) && ($_FILES['uploaded_file']['error'] == 0)) {
  // проверяем, что файл это изображение JPEG и его размер не больше 350кб
  $filename = basename($_FILES['uploaded_file']['name']);
  $ext = substr($filename, strrpos($filename, '.') + 1);
  if (($ext == "jpg") && ($_FILES["uploaded_file"]["type"] == "image/jpeg") && 
    ($_FILES["uploaded_file"]["size"] < 350000000)) {
    // путь для сохранения файла
      $newname = dirname(__FILE__).'/upload/'.$filename;
      // проверяем, файл с таким названием уже есть на сервере
      if (!file_exists($newname)) {
        // переместить загруженный файл в новое место
        if ((move_uploaded_file($_FILES['uploaded_file']['tmp_name'],$newname))) {
           echo "Прелестно, файл был загружен: ".$newname;
        } else {
           echo "Произошла ошибка при загрузке файла!";
        }
      } else {
         echo "Ошибка: файл ".$_FILES["uploaded_file"]["name"]." уже существует";
      }
  } else {
     echo "Ошибка при загрузке файла, изображение не .jpg или больше чем 350кб.";
  }
} else {
 echo "Ошибка: файл не загружен!";
}
?>

убедитесь, что для каталога с файлами установлено разрешение на чтение и запись.

Структура файлов для загрузки изображения на сервер.

— — upload
— — index.php
— — upload.php

к меню ↑

Удалить файлы из папки

Если потребуется удалить все загруженные файлы из папки upload. Добавьте в каталог новый файл delete.php с кодом.

<?php
if (file_exists('./upload'))
foreach (glob('./upload/*') as $file)
unlink($file); 
  
$var = 'Файлы из каталога успешно удалены';
print '<script>alert("'.$var.'");location.reload();</script>' 
?>

Кнопка для удаления файлов в index.php

<button id="button" type="button">Удалить файлы</button>

Обработчик кнопки Ajax jQuery.

<script type="text/javascript">
$(document).ready(function(){
      $("#button").click(function(){
      $.ajax({
		method: 'POST',
		url: 'delete.php',
		success: function(data) {
      $('.results').html(data);
       }
     });
  });
});</script>

Если не нужно удалять не все файлы из папки upload, примените этот код.

<?php
if (file_exists('./upload'))
foreach (glob('./upload/*') as $file)
{
if ($file!='название файла, который не нужно удалять') unlink($file);
}

$var = 'Файлы из каталога успешно удалены';
print '<script>alert("'.$var.'");location.reload();</script>'
?>

Пример загрузки изображения на сервер + обрезка изображения.