Войти Регистрация

PHP Скрипт загрузки файлов


В нашей статье мы рассмотрим пример создания php скрипта загрузки файлов на сервер. Наш простой пример загрузки файлов будет иметь 2 файла: форма (form.html), php скрипт загрузки файлов (uploader.php).

Теперь разберем все детально. Сначала проанализируем файл формы form.html:

<html>

<body>

<form action="uploader.php" method="post"

enctype="multipart/form-data">

         <label for="file">Filename:</label>

        <input type="file" name="file" id="file" />

        <br />

        <input type="submit" name="submit" value="Submit" />

</form>

</body>

</html>

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

Наша форма будет выглядеть так:

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

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

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

// Where the file is going to be placed

$target_path = ‘uploaded_files/';

/* Add the original filename to our target path.

Result is "uploaded_files/filename.extension" */

$target_path = $target_path . basename( $_FILES['file']['name']); 

if(move_uploaded_file($_FILES['file']['tmp_name'], $target_path)) {

    echo "The file ".  basename( $_FILES['file']['name']).

    " has been uploaded";

} else{

    echo "There was an error uploading the file, please try again!";

}

Как работает PHP скрипт загрузки файлов?

uploader.php это простой php скрипт загрузки файлов на сервер, который будет загружать наши файлы в определенную директорию сайта, которая указывается строкой $target_path = 'uploaded_files/';

Далее мы перемещаем загруженный файл с помощью функции move_uploaded_file(), первый ее аргумент это наш загружаемый файл, второй это путь к папке сайта, в которую будем загружать файл.

Ну и само собой делаем элементарный вывод сообщений с помощью if/else, чтобы понятно было, загружен наш файл или нет.

Защита от хакерских взломов при загрузке файла

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

PHP оболочка файла

Это первая проблема, связанная с загрузкой файлов на сервер. Когда загружаемый файл имеет оболочку php, и это не значит, что его расширение будет php.  Он может иметь вид image.jpg (.gif, .png…). Но внутри выглядеть подобным образом:

<?php

   system($_GET['command']);

?>

Некоторые умельцы также могут выполнять команды на сервере с помощью серфинга по url:

$ curl http://server/uploads/shell.php?command=any_unix_command

Способ защиты:

Для защиты, можно реализовать MIME проверку файла. Ниже смотрите пример:

if($_FILES['file']['type'] != "image/gif") {

      echo "Sorry, we only allow uploading GIF images";

      exit;

}

Данный кусок php кода проверяет, является ли загружаемый файл GIF файлом. Вставьте этот код перед php скриптом загрузки файлов. Естественно, вы можете поменять проверку на jpg, pngили другие нужные вам файлы.

По правде сказать, и этот способ защиты можно обойти, если послать заголовок header, с указаниями MIME. Для этого необходимо производить проверку наличия <?php… ?> тегов в загружаемом файле.

Ограничение размера загружаемого файла

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

Можно это сделать с помощью формы, для этого нужно добавить следующую строку в контекст html формы:

<input type='hidden' name='MAX_FILE_SIZE' value='2000000'>

Это скрытое поле ввода ограничит размер загружаемого файла. Или можно сделать проверку размера файла средствами PHP.

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



Дальше: PHP скрипт комментариев + AJAX + JS + MYSQL + CSS


Дискуссия по теме     9 Комментариев
Добавить комментарий
Эмиль 05.03.2013 в 20:33
здравствуйте , спасибо за статью , самое то для новичков . но возник вопрос когда пытался переименовать ****.jpeg на ****.тхт и загрузить .функция все равно пропускала его , то есть браузер передал миме тип в качестве image/jpeg , в чем может быть проблема ?
Тарас 07.03.2013 в 02:15
Нужно проверять как расширение файла, так и mime тип файла. По поводу последнего, в статье есть кусок кода. Ну а расширение файла, нужно взять с имени файла. Для этого пользуйтесь функцией explode, которая разберет имя файла на массив (в качестве параметра разделителя указать точку). последний обьект массива и будет расширением загружаемого файла... далее элементарной проверкой if else проверяем соответствие загружаемого файла.
Эмиль 19.03.2013 в 15:20
Спасибо Тарас все получилось .
Даниил 06.02.2013 в 05:34
Добрый день, Вы прекрасно всё объясняете, но у меня вопрос, а как сделать так, чтобы пользователю выводилась ссылка на скачивание файла, который он сам и залил, ну короче, чтобы сделать простой файлообменник? Спасибо, Даниил.
Тарас 20.02.2013 в 02:27
Необходимо работать с базой данных mysql. Создать таблицу и помещать туда имена файлов, размер, путь к файлу на сервере... и другую необходимую информацию. После чего выводить каждому конкретному пользователю его файлы, для этого потребуется создать еще одно поле в таблице, чтобы хранить ip пользователя. Одним словом, это отдельный урок...
Дмитрий 21.01.2013 в 14:53
Спасибо тебе! Все работает на ура!
Павел 16.01.2013 в 04:34
Спасибо, действительно отличная статья. Но как сделать так, чтобы спустя некоторое время возможно было просмотреть ссылку на этот файл ?
Тарас 16.01.2013 в 14:23
Можно записать путь к файлу в Базу Данных.
vadi1212 25.07.2012 в 03:16
Спасибо, хорошая статья :)
Добавить комментарий
Просмотров: 18000