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

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

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

Рад видеть Вас на страницах своего сайта. Сегодня поговорим о реализации загрузки файлов на сервер. Тема довольно интересная т.к. многих новичков интересует данный вопрос.

Загрузка файлов на сервер средствами PHP значительно облегчит Ваш труд по наполнению фотогалереи или оформления страницы сайта при помощи редактора (например TinyMCE). Также Вы можете загружать любые типы файлов на сервер исходя из Ваших задач.

Для того чтобы загрузить файл на сервер нужно создать форму для загрузки файлов. В принципе данная форма не очень сильно отличается от обычной формы с текстовыми полями, за исключением, что type будет не text, а file (так как мы грузим файлы) и в самой форме добавится атрибут enctype="multipart/form-data". Entype определяет вид кодировки, которую браузер применяет к параметрам формы.


<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
        <title>PHP - Загрузка файлов на сервер своими руками</title>
        <style>
            #wrap{
                width:400px;
                height:100%;
                display:block;
                margin:0 auto;
            }
            h2{
                text-align:center;
            }
        </style>
    </head>
    <body>
        <div id="wrap">
            <h2>Демо: Загрузка файлов на сервер</h2>
            <form enctype="multipart/form-data" method="post" action="uploads.php">
                <p>Загрузите ваши фотографии на сервер</p>
                <p><input type="file" name="files">
                <input type="submit" value="Отправить" name="upload"></p>
            </form>
        </div>
    </body>
</html>

Форму загрузки файлов мы сделали, самое время написать простой обработчик для загрузки файлов на сервер. Определим сразу, что грузить будем только графические файлы с типом jpeg, png, gif. После того как мы определили типы файлов для загрузки на сервер, нам нужно создать папку на самом сервере, куда мы будем складывать наши файлы. В моем примере это папка image, в нее мы будем складывать наши файлы.


<?php
    /**
    * Скрипт загрузки файлов
    * Site: https://bezramok-tlt.ru
    * PHP загрузка файлов на сервер
    */
    
    //Устанавливаем кодировку и вывод всех ошибок
    header('Content-Type: text/html; charset=UTF-8');
    
    //Каталог загрузки картинок
    $uploadDir = './image';
    
    //Вывод ошибок
    $err = array();
    
    //Коды ошибок загрузки файла
    $errUpload = array( 
                         0 => 'Ошибок не возникло, файл был успешно загружен на сервер. ', 
                         1 => 'Размер принятого файла превысил максимально допустимый размер, который задан директивой upload_max_filesize конфигурационного файла php.ini.', 
                         2 => 'Размер загружаемого файла превысил значение MAX_FILE_SIZE, указанное в HTML-форме.', 
                         3 => 'Загружаемый файл был получен только частично.', 
                         4 => 'Файл не был загружен.', 
                         6 => 'Отсутствует временная папка. Добавлено в PHP 4.3.10 и PHP 5.0.3.' 
                      ); 
                      
    //Определяем типы файлов для загрузки
    $fileTypes = array(
                         'jpg' => 'image/jpeg',
                         'png' => 'image/png',
                         'gif' => 'image/gif'
                        );
                        
            

    
    //Если нажата кнопка загрузить
    if(isset($_POST['upload']))
    {
        //Проверяем пустые данные или нет
        if(!empty($_FILES))
        {
            //Проверяем на ошибки
            if($_FILES['files']['error'] > 0)
                $err[] = $errUpload[$_FILES['files']['error']];
                
            //Проверям тип файла для загрузки
            if(!in_array($_FILES['files']['type'], $fileTypes))
                $err[] = 'Данный тип файла <b>'. $_FILES['files']['type'] .'</b> не подходит для загрузки!';
            
            //Если нет ошибок то грузим файл
            if(empty($err))
            {
                $type = pathinfo($_FILES['files']['name']);
                $name = $uploadDir .'/'. uniqid('files_') .'.'. $type['extension'];
                move_uploaded_file($_FILES['files']['tmp_name'],$name);
                
                //Сбрасываем POST параметры
                header('Location: http://'. $_SERVER['HTTP_HOST'] .'/less/uploads/uploads.php?name='. $name);
                exit;
            }
            else
                echo implode('<br>', $err);
        }

    }
    
    //Сообщение об успешной загрузке файла на сервер
    if(isset($_GET['name']))
        echo '<h1>Файл <font color="red">'. htmlentities($_GET['name']) .'</font> успешно загружен!</h1>'; 
        
    //Выводим картинки из каталога
    $imgDir = array_values(array_diff(scandir($uploadDir), array('..', '.')));
    
    for($i = 0; $i < count($imgDir); $i++)
    {
        if($i % 2 == 0)
            echo '<br>'."\n";
        
        echo '<img src="'. $uploadDir .'/'. $imgDir[$i] .'">'."\n";
    }
    
    echo '<br /><br />'."\n";
    echo '<a href="http://'. $_SERVER['HTTP_HOST'] .'" 
            title="http://'. $_SERVER['HTTP_HOST'] .'">
            http://'. $_SERVER['HTTP_HOST'] .'  </a>';

?>

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

Настройки PHP для загрузки файла

max_execution_time = 3000 ; Максимальное время выполнения каждого скрипта в секундах
max_input_time = 400 ; Максимальная количество времени каждый сценарий может потратить разбора запроса данных
memory_limit = 500M ; Максимальный объем памяти, скрипт может потреблять (8 МБ)
post_max_size = 500M ; Максимальный размер данных POST, что PHP будет принимать.
upload_max_filesize = 200M ; Максимально допустимый размер для загружаемых файлов.
Спасибо Кириллу за найденую уязвимость. Листинг скрипта и архив поправил.

Скачать: PHP – Загрузка файлов на сервер своими руками


Теги
Поддержи проект:

No-name
Кирилл
Тут уязвимость

echo '<h1>Файл <font color="red">'. $_GET['name'] .'</font> успешно загружен!</h1>';
т.е. можно провести xss атаку

uploads.php?name=<xss>

Исправить можно следующим образом:

echo '<h1>Файл <font color="red">'. htmlentities($_GET['name']) .'</font> успешно загружен!</h1>'; 

04/09/2017 03:28:15

Администрация
Администрация

Спасибо Кирилл за действенно замечание, все поправил.

05/09/2017 07:52:27

No-name
feeel1
 а возможно загрузка файла в не в указанную папку в коде, а со стороны клиента выбор папки куда заливать фаил?

27/12/2015 00:34:59

Администрация
Администрация

Да можно, но это уже на уровне файлового менеджера. Да и проблемы с безопасностью могут быть. Вот например бесплатный файловый менеджер для сайта. http://www.responsivefilemanager.com/

29/12/2015 16:41:15

No-name
Danila
Спасибо очень полезно!

08/03/2015 18:52:16

Администрация
Администрация
Пожалуйста :)

08/03/2015 20:22:32


Copyright © 2014 - 2024 All rights reserved.