10 правил этикета электронной почты

Загрузка файла на сервер с помощью JavaScript и библиотеки JQuery. Пример загрузки файлов на сервер (upload) на языке php Хранение файлов в базе данных mySQL

Для того чтобы сделать систему загрузки картинки или любого другого файла на сервер используется HTML-форма и PHP-скрипт обработки данных, отправленных этой формой. Именно таким способом реализованы разнообразные сервисы поддерживающие загрузку файлов на сервер. Реализуется она подобно обычной форме отправки данных на сервер .

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

Самая простая форма загрузки файла:





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

Параметр entype получает в этой форме значение multipart/form-data, что определяет, что в данной форме будет выполнена отправка бинарных данных, т.е. файла. Если это значение не указать, то по умолчанию форма будет выполняться как отправка текстовой информации.

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

Для указания загружаемого файла тег должен содержать тип "file", а так же для дальнейшей работы PHP-скрипта следует указать значение "name".

Отправка данных формы выполняется тегом с типом "submit". Он отображается обычной кнопкой.

PHP код сохранения файла

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

В принимающем коде, данные о файле содержатся суперглобальном массиве $_FILES. Соответственно, просмотреть сведения об отправленном из формы файле, можно в $_FILES["my_file"]. Такой массив содержит следующую информацию:

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

Копирование выполняется функцией copy() , параметрами которой служит имя исходного файла (для этого случая имя временного файла - $_FILES["my_file"]["tmp_name"]) и имя конечного файла.

В итоге должен получиться следующий код:

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

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

Функция copy() возвращает значение true, если копирование выполнено успешно и False при возникновении ошибки в процессе копирования.

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

Приложение для загрузки файлов на сервер представляет собой HTML-форму (upload.html) и скрипт upload.php для ее обработки.

Замечание: Вы можете загрузить промышленную версию системы загрузки файлов на сервер из раздела . Система позволит вам не только загрузить файл на сервер, но и изменить его размер, фон и др.

Код формы (upload.html)

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



Код скрипта обработки формы (upload.php)

Результат загрузки файла

Атрибут entype формы определяет вид кодировки, которую браузер применяет к параметрам формы. Для того чтобы отправка файлов на сервер действовала, атрибуту entype необходимо присвоить значение multipart/form-data. По умолчанию этот атрибут имеет значение application/x-www-form-urlencoded.

Элемент ввода этой формы должен иметь тип file.

После того, как получен HTTP-запрос, содержимое загруженного файла записывается во временный файл, который создается в каталоге сервера, заданном по умолчанию для временных файлов, если другой каталог не задан в файле php.ini (директива upload_tmp_dir).

Характеристики загруженного файла доступны через двумерный массив $_FILES.

Cкрипт upload.php загружает файл на сервер и копирует его в каталог /path/to/file/.

В некоторых случаях требуется ограничить размер файла, который может быть загружен на сервер. К примеру, чтобы разрешить загрузку на сервер только файлов с размером не более 3 Мбайт, в приведенном скрипте содержится код:

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

Как загрузить файл на сервер используя PHP? В этой статье мы подробно рассмотрим этот вопрос с примерами.

HTML-форма для отправки файла

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

Вот пример HTML-кода такой формы:

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

Что уникального в этой форме:

  • Тег form должен обязательно содержать атрибут enctype="multipart/form-data . Именноо этот атрибут указывает на то, что форма будет передавать файл. По умолчанию атрибут enctype имеет значение application/x-www-form-urlencoded .
  • Форма должна содержать скрытый атрибут (type="hidden") с именем MAX_FILE_SIZE в значении которого (value) указывается размер файла. Теоретически, браузеры должны сообщать о том, что файл превышает допустимые размеры, но на практике браузеры не поддерживают это. Я думаю, что этот атрибут можно не указывать.
  • Для выбора передаваемого файла служит тег input , у которого атрибут type="file" .
  • После того, как сервер получил HTTP-запрос от такой формы, он записывает файл во временную папку на сервере.

    Если хотите чтобы файл на этом этапе сохранялся в другой каталог, укажите его в директиве upload_tmp_dir файла php.ini.

    Для перемещения загруженного файла в новое место используется функция move_uploaded_file .

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

    Итак, после того, как скрипт получил данные формы с переданным файлом, файл он записал в специальную папку, а данные о файле записал в двумерный массив $_FILES .

    Давайте рассмотрим пример, который выводит содержимое массива $_FILES на экран.

    Вот что мы получим в результате работы этого скрипта:

    Рис.1. Массив $_FILES.

    Теперь давайте разберём, что содержится в этом массиве.

    В нашем двумерном массиве $_FILES есть один элемент filename . Это значение поля name из элемента формы:

    Данные для этого файла:

    • $_FILES["filename"]["name"] - имя файла;
    • $_FILES["filename"]["type"] - тип файла;
    • $_FILES["filename"]["tmp_name"] - полный путь к временному каталогу на диске;
    • $_FILES["filename"]["error"] - содержит код ошибки, который это 0, если операция прошла успешно;
    • $_FILES["filename"]["size"] - размер файла.

    Можно было бы в форме указать два поля для файлов, например так:


    В этом случае наш массив выглядел бы так:


    Рис.2. Массив $_FILES.

    Итак, теперь мы знаем как устроен массив $_FILES и следующий шаг - положить полученный файл в нужное нам место.

    Функция move_uploaded_file

    Как я уже писал, для перемещения загруженного файла в новое место используется функция move_uploaded_file .

    Синтаксис функции move_uploaded_file:

    move_uploaded_file (откуда переносить, куда переносить)

    Функция move_uploaded_file возвращает булево значение:

    • TRUE - в случае успеха,
    • FALSE - если первый аргумент является загруженным файлом, но по каким-либо причинам не может быть перемещён в указанное место, в этом случае никаких действий не предпринимается.

    Используем эту функцию в примере:

    Этот скрипт перемещает картинку в ту же папку, в которой он сам находится. Для этого мы используем встроенные в PHP константы для указания пути:

    • __DIR__ - одна из "волшебных" констант, содержит директорию файла.
    • DIRECTORY_SEPARATOR - предопределённая константа, содержащая разделитель пути. Для ОС Windows это «\», для ОС Linux и остальных - «/».

    Внимание: Если результирующий файл уже существует, он будет перезаписан.

    Функция is_uploaded_file

    Ест ещё одна функция, которую нужно обязательно использовать при работе с загрузкой файлов на сервер. Это функция is_uploaded_file и она используется из соображений безопасности.

    is_uploaded_file - определяет, был ли файл загружен при помощи HTTP POST и возвращает TRUE, если это так.

    Использование этой функции целесообразно для удостоверения, что злонамеренный пользователь не пытается обмануть скрипт так, чтобы он работал с файлами, с которыми работать не должен - к примеру, /etc/passwd .

    Обратите внимание: для правильной работы функции is_uploaded_file нужно передать путь к файлу на временном хранилище на сервере, то есть аргумент вида $_FILES["filename"]["tmp_name"] , - а вот имя закачиваемого файла на клиентской машине ($_FILES["filename"]["name"]) тут не подходит.

    Наш конечный пример скрипта, обрабатывающего форму отправки файла, будет выглядеть так:

    Ограничиваем размер файла

    В некоторых случаях требуется ограничить размер файла, который может быть загружен на сервер. К примеру, чтобы разрешить загрузку на сервер только файлов с размером не более 3 Мбайт, в приведенном скрипте содержится код:

    Максимальный размер загружаемого файла можно также задать при помощи директивы upload_max_filesize в файле в php.ini. Значение этой которой директивы по умолчанию равно 2 Мбайт:

    Настройки php.ini для загрузки файлов на сервер

    Итак, мы узнали про директиву upload_max_filesize файла php.ini которая устанавливает максимальный размер загружаемого файла. Какие ещё директивы файла php.ini отвечают за загрузку файлов на сервер?

    Кстати, если Вы хотите узнать, где расположен Ваш файл php.ini, выполните скриптик:

    Итак, список директив файла php.ini:

    • file_uploads - возможность запретить или разрешить загрузку файлов на сервер в целом, по умолчанию разрешена (значение On).
    • post_max_size - общее ограничение сверху на размер данных, передаваемых в POST запросе. Если Вам необходимо передавать несколько файлов одновременно, или работать с большими файлами, измените значение этой директивы. Значение по умолчанию 8Мб.
    • upload_max_filesize - уже рассмотренная нами директива. Не забывайте при необходимости также менять post_max_size .
    • upload_tmp_dir - временная директория на сервере, в которую будут помещаться все загружаемые файлы.

    Это всё, что я хотел сказать Вам по теме "Загрузка файлов на сервер в PHP".

    Наверное многие сталкивались с вопросом "Как загрузить файл на сервер с помощью JS и JQuery?".
    И вероятно не у всех получилось это сделать. На самом деле все не так сложно как кажется.
    В данном уроке я опишу процесс загрузки файла на сервер(хостинг) .
    Для обмена данными между браузером и веб-сервером, используется технология ajax.
    Версия JQuery используемая в рецепте: 2.2.2.

    Создаем примитивную разметку из тегов html, head и body.
    В теге head необходимо прописать путь до библиотеки jquery.
    В примере я использую jquery с сервера google.

    В теге body создаем форму, которая состоит из тега input и button.
    С помощью input type="file" осуществляется выбор файла для загрузки.
    Тег button необходим для запуска js кода на передачу файла.

    Форме задаем name="uploader", enctype="multipart/form-data", method="POST".
    Имя формы: name="uploader"
    Способ кодирования данных формы: enctype="multipart/form-data"
    Метод передачи данных: method="POST"

    Отправить этот файл: Загрузить

    Весь код html и js разметки:
    Отправить этот файл: Загрузить

    Переходим к java script коду.
    Для передачи файла необходимо передавать форму целиком:
    $("form").submit(function(e) {

    Считываем данные формы в переменную:
    var formData = new FormData($(this));

    Далее для передачи данных на веб-сервер используем технологию ajax.
    В случае успешной передачи файла во всплывающем окне будет отображено соответствующее сообщение.
    В случае возникновения ошибки или отсутствии файла будет отображено сообщение с текстом возникшей проблемы.
    $.ajax({ url: "file.php", type: "POST", data: formData, async: false, success: function (msg) { alert(msg); }, error: function(msg) { alert("Ошибка!"); }, cache: false, contentType: false, processData: false });

    Весь код на java script с использование jquery:

    Теперь остался код на стороне сервера для приема данных с формы методом POST запроса.

    Получаем корневую директорию сайта и назначаем папку для загрузки файлов:
    $uploaddir = $_SERVER["DOCUMENT_ROOT"].DIRECTORY_SEPARATOR."uploads".DIRECTORY_SEPARATOR;

    Считываем загружаемый файл:
    $uploadfile = $uploaddir . basename($_FILES["userfile"]["name"]);

    Проверяем загружен ли файл.
    В соответствии с входящими данными назначаем сопровождающее сообщение.
    Если файл не загружен, загружаем в директорию указанную в $uploadfile:
    if (move_uploaded_file($_FILES["userfile"]["tmp_name"], $uploadfile)) { $out = "Файл корректен и был успешно загружен.\n"; } else { $out = "Возможная атака с помощью файловой загрузки!\n"; }

    При выполнении указанных действий возвращается ответ.

    Весь код на php:

    Весь html код включая js:

    Отправить этот файл: Загрузить $("form").submit(function(e) { var formData = new FormData($(this)); $.ajax({ url: "file.php", type: "POST", data: formData, async: false, success: function (msg) { alert(msg); }, error: function(msg) { alert("Ошибка!"); }, cache: false, contentType: false, processData: false }); e.preventDefault(); });

    Скачать файл с исходным кодом:

    Сегодня я хочу рассказать вам о разнообразных ситуациях, связанных с загрузкой файлов на сервер с помощью PHP-скриптов . Постараюсь привести примеры, как самой простой загрузки файла, так и мультизагрузки с применением move uploaded file PHP .

    Для загрузки файлов на сервер. Прежде всего, нужно создать HTML-форму с полем file input . Затем привязать к ней PHP-скрипт , который переместит файл в указанную директорию. Чтобы закачать файл на сервер с помощью PHP-скрипта , выполните следующие действия:

  • Создайте простую HTML-форму : потребуется простая форма с возможностью указания файла. Она размещается в файле basic.php :
  • Basic File Upload Basic File Upload Upload File

    Приведенный выше код необходим для создания формы. Как только пользователь выбирает файл и нажимает кнопку Upload , форма передаст данные с помощью метода POST на этой же странице, так как в качестве обработчика указан файл basic.php :

    Важно: не забудьте добавить enctype=”multipart/form-data” в тег .

  • Создаем PHP-скрипт для обработки формы загрузки. В PHP вся информация о загруженных файлах содержится в глобальной переменной $_FILES . То есть, используя $_FILES , можно проверить, был ли загружен файл. Если файл был загружен, то можно переместить его в нужную директорию при помощи функции move_uploaded_file PHP :
  • Приведенный выше код проверяет, загрузил ли пользователь файл. Если файл загружен, то мы перемещаем файл в указанную директорию. В приведенном выше скрипте мы перемещаем файл в ту же папку, где находится файл basic.php .

    Ниже приведена полная версия PHP move uploaded file примера :

    Basic File Upload Basic File Upload Upload File

    Пожалуйста, не тестируйте этот PHP move uploaded file пример на сервере. Он не отвечает требованиям безопасности, и был создан специально для того, чтобы наглядно показать, как загружать файлы с помощью PHP .

    Вопрос: Почему приведенный выше скрипт небезопасен?
    Ответ: С помощью скрипта, приведенного выше, можно загрузить файл любого типа на сервер. То есть, если вы используете скрипт в таком виде на “живом ” сервере, то любой хакер сможет загрузить собственные PHP-скрипты , и взломать ваш сайт и сервер.

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

    Что такое $_FILES?

    $_FILES – это глобальная переменная в PHP наподобие $_POST или $_GET . Она представляет собой ассоциативный массив, в котором находится информация о загруженном файле с помощью метода HTTP POST .

    То есть, если выполнить print_r($_FILES) для приведенного выше скрипта, то мы получим следующую информацию:

    Array ( => Array ( => upload-file-php.jpg => image/jpeg => /Applications/XAMPP/xamppfiles/temp/phpcQiYhh => 0 => 6887))

    То есть, для каждого поля в массиве создается элемент. Если вы создадите , то название элемента также будет изменено на test . Например:

    Array ( => Array ( => upload-file-php.jpg => image/jpeg => /Applications/XAMPP/xamppfiles/temp/phpcQiYhh => 0 => 6887))

    Теперь для каждого input file , перемещаемого с помощью move uploaded file PHP , создается пять элементов (name , type , tmp_name , error , size ). Давайте познакомимся с этими элементами поближе:

  • name: содержит название загруженного пользователем файла. Если вы загрузите файл abc.txt в браузер, то элемент name получит название abc.txt ;
  • type: тип загруженного файла или mime-type , если точнее. Для файла JPG этот элемент будет иметь значение image/jpeg . Если загрузить текст, то элемент получит значение text/plain . Для разных типов файлов разным будет и mime-type . Ниже приведены самые распространенные mime-типы :
    • JPEG: image/jpeg ;
    • PNG: image/png ;
    • Текст: text/plain ;
    • Word: application/msword .
  • tmp_name: временное расположение для загруженного файла. Этот путь можно изменить в переменной upload_tmp_dir , указанной в файле php.ini .
  • error: информация об ошибке. Включает в себя тип ошибки, возникшей в процессе загрузки. Например, когда размер файла превышает максимальный или когда не был указан файл для загрузки. Для любой возникшей ошибки имеется числовое значение и константа. Ниже приведен полный список ошибок, которые могут возникнуть в PHP move uploaded file примере :
    • UPLOAD_ERR_OK (значение 0) . Означает, что файл был успешно загружен без ошибок;
    • UPLOAD_ERR_INI_SIZE (значение 1) . Размер файла превышает указанный в переменной upload_max_filesize в файле php.ini ;
    • UPLOAD_ERR_FORM_SIZE (значение 2) . Размер файла превышает установленное в переменной формы MAX_FILE_SIZE значение;
    • UPLOAD_ERR_PARTIAL (значение 3) . Файл загружен не полностью;
    • UPLOAD_ERR_NO_FILE (значение 4) . Отсутствует файл для загрузки;
    • UPLOAD_ERR_NO_TMP_DIR (значение 6) . Указанной директории для временного хранения не существует;
    • UPLOAD_ERR_CANT_WRITE (значение 7) . Невозможно записать файл на диск.
  • size: размер загруженного файла в байтах.
  • Что такое move_uploaded_file?

    move_uploaded_file представляет собой функцию, которая перемещает загруженный файл из временной директории в папку назначения. Перед перемещением move_uploaded_file PHP проверяет, был ли загружен файл, указанный в HTTP-методе post .

    Если файл был успешно перемещен, то вы получите ответ true или false . В первом примере мы использовали следующую строку кода:

    move_uploaded_file($_FILES["inputfile"]["tmp_name"], $destiation_dir)

    А теперь давайте сделаем красиво, и выведем информацию:

    if(move_uploaded_file($_FILES["inputfile"]["tmp_name"], $destiation_dir)){ echo "File Uploaded" } else{ echo "File Not uploaded" }

    Изменяем лимит размера загружаемого файла

    У каждой формы для загрузки файлов должен быть установлен лимит размера, иначе пользователи станут загружать увесистые файлы. Выставить ограничение на move uploaded file PHP можно двумя способами:

    • В файле PHP.ini есть специальная переменная upload_max_filesize , которая отвечает за максимальный размер загружаемых файлов. Далее приведена строчка из php.ini , которая ограничивает размер загружаемых файлов до 20 Мб: upload_max_filesize = 20M .
    • Если загружаемый файл будет иметь больший размер, то пользователь получит ошибку UPLOAD_ERR_INI_SIZE или значение «2» в переменной $_FILES . Важно учесть, что значение переменной upload_max_filesize не должно превышать значение переменной post_max_size , указанной в php.ini ;
    • Ограничить размер загружаемого файла можно, поместив скрытый элемент ввода с названием UPLOAD_ERR_INI_SIZE в форму загрузки. Сделать это можно так: .

    Если нужно сильно увеличить filesize , то не забудьте изменить время исполнения php-скриптов .

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

    Теперь вы умеете ограничивать размер загружаемых файлов и знаете, как определить типы файлов, которые загружают пользователи. Пришло время позаботиться о безопасности нашего PHP move uploaded file примера.

    В качестве примера сделаем так, чтобы пользователи не могли загружать jpeg-файлы размером свыше 1 Мб. Установите соответствующее ограничение в переменной upload_max_filesize файла php.ini . Ниже приведена улучшенная версия скрипта:

    Secure File Upload Secure File Upload Upload File

    Мультизагрузка файлов при помощи PHP-скрипта

    Можно загружать сразу несколько файлов при помощи $_FILES и move_uploaded_file PHP . Ниже я расскажу вам о двух способах мультизагрузки файлов с помощью PHP-скрипта :

  • Используя разные имена Input .
  • Используя одно и то же имя input, но с привлечением массива.
  • 1. Используя разные имена Input:

    Можно загружать сразу несколько файлов, используя несколько элементов ввода. Как уже говорилось ранее, если мы создаем несколько элементов input, то в $_FILES будет создано несколько основных элементов. Например, для приведенной ниже формы:

    $_FILES представит массив следующего содержания:

    Array ( => Array ( => 20141002_094257.jpg => image/jpeg => /Applications/XAMPP/xamppfiles/temp/phpoBWrBZ => 0 => 2669096) => Array ( => 20141002_094247.jpg => image/jpeg => /Applications/XAMPP/xamppfiles/temp/phpjwUmVZ => 0 => 2207657))

    Приведенный ниже PHP move uploaded file пример нужно писать с учетом того, что один элемент предназначен для аватарки (изображение ), а другой – для загрузки резюме (файла в формате .doc ):

    Multiple File Upload Multiple File Upload Profile Pic
    Resume