программирование на PHP
Bullet (black) Email иконка RSS иконка
  • Урок 10. UPLOAD файла. Загрузка файла на сайт.

    Июль 31st, 2008 Александр 61 Комментариев

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

    Детали

    Вот что мы разберем в сегодняшнем уроке:

    • Форма отправки файла;
    • Скрипт загрузки файла;
    • Дальнейшие действия (копирование, перемещение файла и тд);
    • +Бонус.

    Форма отправки файла

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    <!--?php<br /--> echo '

    <form action="upload.php" enctype="multipart/form-data" method="post">'
    ;
    echo 'Файл:
    <input name="FILE" size="30" type="file" /> '
    ;
    echo '
    <input type="submit" value="загрузить" />'
    ;
    echo '</form>';
    ?&gt;

    Эта форма содержит дополнительный атрибут enctype=»multipart/form-data», он как раз таки указывает что форма будет использоваться для загрузки файла. Также поле input теперь имеет другой тип type=»file». Сохраните файл в в отдельной папке, пусть её имя будет upload. Обратитесь к ней из браузера (http://127.0.0.1/upload/), у вас должна появится следующая картинка:

    UPLOAD файла

    Создайте новый файл upload.php. Это будет скрипт, который будет обрабатывать полученный файл, копировать его в нужное место. Файл который мы передаем из формы мы будем извлекать из суперглобального массива $_FILES. Давайте разберем его содержание:

    • $_FILES['FILE']['name'] - имя полученого файла;
    • $_FILES['FILE']['type'] - Mime-тип полученного файла (пример image/gif);
    • $_FILES['FILE']['size'] – размер полученного файла в байтах;
    • $_FILES['FILE']['tmp_name']- временное имя, с которым принятый файл был сохранен на сервере.

    А теперь посмотрим как это все работает. Создайте новый файл.

    upload.php

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    <!--?php</p-->

    $url = "files";
    // 1)Проверяем, существует ли имя.
    if($_FILES['FILE']['name']){
    // 2)Проверяем размер файла
    if($_FILES['FILE']['size'] != 0 AND $_FILES['FILE']['size']&lt;=102400)
    {
    // 3)Проверяем загрузился ли файл на сервер
    if(is_uploaded_file($_FILES['FILE']['tmp_name'])) {
    // 4)Перемещаем загруженный файл в необходимую папку $url
    if(move_uploaded_file($_FILES['FILE']['tmp_name'], $url."/".basename($_FILES['FILE']['name']))) {
    //Выводим сообщение что файл обработа и загружен
    echo 'Файл '.basename($_FILES['FILE']['name']).' был успешно загружен в '.$url;
    }
    else { echo 'Произошла ошибка при перемещении файла в папку'.$url;}

    }
    else {echo 'Прозошла ошибка при загрузке файла на сервер';}

    }
    else { echo 'Размер файла не должен превышать 100Кб';}
    }
    else { echo 'Файл должен иметь название';}

    ?&gt;

    Как видите скрипт содержит несколько стандартных условий:

    1. Проверка имени файла;
    2. Проверка загрузился ли файл ( не будет работать, если файл превышает upload_max_filesize, выставленный в php.ini вашего веб сервера, в WAMP по умолчанию максимальный размер загружаемого файла равен 2Мб);
    3. Проверка размера загруженного файла, в этом скрипте по умолчанию не более 100кб;
    4. Далее проверяем был ли перемещен файл в нужную нам папку на сервере.

    Если все условия выполены – выводим сообщение об успешно завершенной операции. Если данный скрипт необходимо доработать для загрузки только фоток jpg, то просто можете добавить дополнительное условие между 1 и 2:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <!--?php</p-->

    $url = "files";
    // 1)Проверяем, существует ли имя.
    if($_FILES['FILE']['name']){
    if($_FILES['FILE']['type'] == 'image/jpeg') {
    //2,3,4 Условия
    }
    else { echo 'Файл не является картинкой формата JPG';}
    }
    else { echo 'Файл должен иметь название';}

    ?&gt;

    В принципе можно доработать под любой тип файла, полный список mime-типов можете найти здесь. Чтобы не возникало ошибок создайте папку files в папке upload

    +BONUS

    В качестве небольшого бонуса написал функцию для файлового менеджера из предыдущего урока «Файловый менеджер на PHP«. Для того чтобы добавить возможность загрузки файлов, мы напишем функцию и поместим её в файл с функциями.

    functions.inc.php

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    //Функция загрузки файлов на сервер
    function uploadfile($url,$FILE) {
    //$url - текущая папка, $file - массив $_FILES
    //Проверяем, существует ли имя.
    if($FILE['FILE']['name']){

    //Проверяем загрузился ли файл на сервер
    if(is_uploaded_file($_FILES['FILE']['tmp_name'])) {
    //Проверяем размер файла
    if($FILE['FILE']['size'] != 0 AND $FILE['FILE']['size']&lt;=102400) {
    //Перемещаем загруженный файл в необходимую папку $url
    if(move_uploaded_file($FILE['FILE']['tmp_name'], $url."/".basename($FILE['FILE']['name']))) {
    //Выводим сообщение что файл обработа и загружен
    return TRUE;
    }
    else { echo 'Произошла ошибка при перемещении файла в папку'.$url;}

    }
    else {echo 'Размер файла не должен превышать 100Кб';}

    }
    else { echo'Прозошла ошибка при загрузке файла на сервер';}
    }

    else { echo 'Файл должен иметь название';}

    }

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

    1
    echo '<a href="index.php?upload=1&amp;url='.$url.'">[загрузить файл]</a>';

    В качестве параметра ссылка передает $upload и $url. Вставим условие в самом в конце файла:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    //Загрузка файла
    if($_GET['upload'])
    {
    if(!$_POST['up']) {
    echo '

    <form action="?upload=1" enctype="multipart/form-data" method="post">'
    ;
    echo 'Выберите файл (не более 100кб):
    <input name="FILE" size="20" type="file" /> '
    ;
    echo '
    <input name="url" type="hidden" value="'
    .$_GET['url'].'" />';
    echo '
    <input name="up" type="submit" value="загрузить" />'
    ;
    echo '</form>';

    }
    else {
    if(uploadfile($_POST['url'],$_FILES)!== FALSE) {
    header("location:index.php?url=".$_POST['url']);     }
    else {echo 'Ошибка
    '
    ;}
    }
    }

    Вот такой небольшой апгрейд нашего файлового менеджера. Я думаю вам пригодится этот урок.

    Скрипт

    simplefileupload.zip

    Заключение

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

    61 Responses to “Урок 10. UPLOAD файла. Загрузка файла на сайт.”

    Страниц: « 7 6 5 4 3 2 [1] Show All

    1. 10
      ДудкаNo Gravatar Says:

      Хорошая статья, спасибо. Я не очень разбираюсь в php и возникли вопросы по небольшому расширению скрипта.
      Вы не подскажите как со страницы отправки файла выбрать и загрузить его в нужную директорию на сервере и чтобы после загрузки был вывод ссылки на файл.

    2. 9
      ЕвгенийNo Gravatar Says:

      Побольше бы таких статейl!

    3. 8
      ВадикNo Gravatar Says:

      Побольше бы таких статейl!

    4. 7
      DeviceNo Gravatar Says:

      огромное спасибо!!! :)

    5. 6
      АлександрNo Gravatar Says:

      2 Device
      Достаточно просто после загрузки файла на сервер, добавить скрипт сканирования директории.Получив массив с именами файлов на сервере мы вводим дополнительное условие, которое ищет совпадения в массиве $files[] с $_FILES['FILE']['name'] при помощи функции array_search. Если условие выполняется, то задается префикс $prefix, который при перемещении файла в директорию добавляется к имени файла. Если же условие не выполняется, то префикс будет пуст. Вот такое простое решение.

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      50
      51
      52
      53
      54
      <?php

      $url = "files";

        //Проверяем, существует ли имя.
      if($_FILES['FILE']['name']){
              if($_FILES['FILE']['type'] == 'image/jpeg') {
      //Проверяем размер файла
          if($_FILES['FILE']['size'] != 0 AND $_FILES['FILE']['size']<=1024000){

              //Проверяем загрузился ли файл на сервер
              if(is_uploaded_file($_FILES['FILE']['tmp_name']))  {

              //Проверяем, является ли директорией
      if (is_dir($url)) {
      //Проверяем, была ли открыта директория
      if ($dir = opendir($url)) {
      //Сканируем директорию
      while ($file = readdir($dir)) {
      //Убираем лишние элементы
      if ($file != "." && $file != "..") {
      //забиваем массив
      $files[]=$file;
      }
      }
      //Закрываем директорию
      closedir($dir);
      }
      }

      if(array_search($_FILES['FILE']['name'],$files)) { $_prefix = "copy_";}



                  //Перемещаем загруженный файл в необходимую папку $url
                  if(move_uploaded_file($_FILES['FILE']['tmp_name'], $url."/".$_prefix . basename($_FILES['FILE']['name']))) {
                          //Выводим сообщение что файл обработа и загружен
                          echo 'Файл '.basename($_FILES['FILE']['name']).' был успешно загружен в '.$url;

                                                                                                                 }
                  else { echo 'Произошла ошибка при перемещении файла в папку'.$url;}

                                                                                    }
              else {echo 'Размер файла не должен превышать 100Кб';}

                                                              }
          else { echo'Прозошла ошибка при загрузке файла на сервер';}
                                   }
                           else { echo 'Файл не является картинкой формата JPG';}
                                   }

      else { echo 'Файл должен иметь название';}

          ?>
    6. 5
      DeviceNo Gravatar Says:

      Здравствуйте! а как организовать проверку что файл с таким именем уже существует в папке сохранения и присовить сохраняемому файлу другое имя?

      заранее спасибо!

    7. 4
      GlamNo Gravatar Says:

      Супер статья всё понятно! Спасибо, продолжай в том же духе!

    8. 3
      АлександрNo Gravatar Says:

      Ничего страшного ;)

    9. 2
      MonsNo Gravatar Says:

      Упс. Пропустил в коде строчку про размер. Извиняюсь.

    10. 1
      MonsNo Gravatar Says:

      Как насчет установки лимита на размер файла.

      Ведь у нас много приколистов. Могут и зажать F5 при заливке. Или фильм в двд заливать.

      Спасибо за скрипт. Буду его расматривать внимательнее. Пригодится для конкурса моего. Там нужно будет это.

    Страниц: « 7 6 5 4 3 2 [1] Show All

    Leave a Reply


freshcoder.ru © 2008 • При использовании материалов активная ссылка на сайт обязательна.