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

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

Но не буду вас запугивать, а лучше представлю вашему вниманию уже готовую функцию (PHP скрипт) для проверки и загрузки файлов на сервер. Функция 100% рабочая. Я сам использую её на своих сайтах. Данная функция написана под загрузку файлов изображений (фоток) в формате.jpg, .gif, .png. Но при желании можно внести изменения, чтобы адаптировать PHP скрипт под свои нужды.

В php скрипте реализованы две проверки:

  1. так как хостер ограничивает размер загружаемого файла (на момент написания данного материала у меня на хостинге стоит ограничение в 8 Mb), то проверка максимального размера необходима;
  2. проверка расширения файла позволяет отсеять ненужные файлы до загрузки.

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

Теперь о том, как это реализовать практически

Помещаем PHP код функции в отдельный файл: function.php и размещаем его на сервере в корневом каталоге.

И создадим html-файл в котором разместим форму для загрузки фото: index.html

upload.php - файл обработчик формы
name="button" - имя кнопки, при нажатии на которую запускается функция загрузки файла на сервер

Загрузка нескольких файлов

Теперь разберем случай, когда необходимо загрузить на сервер сразу несколько файлов.
Для этого нам понадобиться в файлах function.php upload.php и index.html сделать некоторые изменения.





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

Еще одна функция, которая тесно связана с загрузкой графических файлов (фоток) - это функция для изменения размеров фотки:

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

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





Ключевой момент здесь - это атрибут "enctype " со значением "multipart/form-data ". Без него ничего работать не будет.

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

print_r($_FILES);
?>

В результате, Вы увидите содержимое глобального двумерного массива $_FILES :

  • name - имя загружаемого файла.
  • type - MIME-type загружаемого файла. Это, пожалуй, самый важный параметр для обеспечения безопасности. И всегда при приёме файлов необходимо проверять MIME-type , иначе проблем не оберётесь. В следующей статье мы поговорим об этом более детально.
  • tmp_name - физический путь к временному файлу. Именно в это место и помещается файл, а уже потом мы его переносим в другое место. Фактически, файл уже загружен, а нам лишь надо его переместить в нужную папку на сервере.
  • error - код ошибки. Если 0 , то ошибок нет.
  • size - размер загружаемого файла. Вот это тоже частоиспользуемая опция, и её также надо проверять, чтобы ограничить размер загружаемых файлов . Безусловно, самим сервером этот размер ограничен, однако, для всяких картинок, этот размер явно завышен (как правило, он 10 МБ ).

И все эти параметры присутствуют для каждого загружаемого файла (каждые из которых представляют собой массив в двумерном массиве $_FILES ).

Теперь давайте уже закончим с загрузкой файлов на сервер в PHP , и для этого напишем такой код (""):

$uploadfile = "images/".$_FILES["somename"]["name"];
move_uploaded_file($_FILES["somename"]["tmp_name"], $uploadfile);
?>

То есть вначале мы задаём путь к загружаемому файлу на сервере. Здесь мы хотим поместить файл в директорию "images " с тем же именем, что и было раньше у файла. А функцией move_uploaded_file() мы перемещаем файл в выбранную нами директорию из его временного хранилища.

Однако, обратите внимание, это очень важно! Так использовать код ни в коем случае нельзя, иначе Вашему сайту будет угрожать серьёзная опасность! Фактически, на данный момент может быть загружено абсолютно всё, что угодно: любые исполняемые файлы, скрипты, HTML-страницы и другие весьма опасные вещи. Поэтому обязательно надо проверять загружаемые файлы на сервер очень тщательно. И вот этим мы и займёмся в следующей статье. Поскольку тема очень важная, то я советую Вам подписаться на обновления, чтобы не пропустить эту статью.

Для того чтобы сделать систему загрузки картинки или любого другого файла на сервер используется 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"]) и имя конечного файла.

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

// указание директории и имени нового файла на сервере
$new_file = "/upload_files/" .$_FILES["uploadfile" ]["name" ];

// копирование файла
if (copy($_FILES["uploadfile" ]["tmp_name" ], $new_file)) {
echo "Файл загружен на сервер" ;
} else {
echo "Ошибка при загрузке файла" ;
?>

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

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

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

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

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

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

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

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

Демо: Загрузка файлов на сервер

Загрузите ваши фотографии на сервер

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

"Ошибок не возникло, файл был успешно загружен на сервер. ", 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 = "Данный тип файла ". $_FILES["files"]["type"] ." не подходит для загрузки!"; //Если нет ошибок то грузим файл 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("
", $err); } } //Сообщение об успешной загрузке файла на сервер if(isset($_GET["name"])) echo "

Файл ". htmlentities($_GET["name"]) ." успешно загружен!

"; //Выводим картинки из каталога $imgDir = array_values(array_diff(scandir($uploadDir), array("..", "."))); for($i = 0; $i < count($imgDir); $i++) { if($i % 2 == 0) echo "
"."\n"; echo ""."\n"; } echo "

"."\n"; echo " http://". $_SERVER["HTTP_HOST"] ." "; ?>

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

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

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

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




В качестве параметра enctype в такой форме нужно указывать значение multipart/form-data. Отправляется методом POST.

Как обрабатывать multipart-формы на PHP

После нажатия кнопки "Загрузать" PHP помещает файл во временную директорию и задает файлу временное имя(оно отличается от загружаемого - ниже будет видно). И сразу же создается 4 переменных глобального массива $_FILES:

  • $_FILES["uploadfile"]["name"] - имя файла до его отправки на сервер (то есть оригинальное);
  • $_FILES["uploadfile"]["size"] - размер принятого файла в байтах;
  • $_FILES["uploadfile"]["type"] - MIME-тип принятого файла (если браузер смог его определить), например: image/gif, image/png, image/jpeg, text/html;
  • $_FILES["uploadfile"]["tmp_name"] - содержит имя файла во временном каталоге, например: /tmp/php57Opq2Y;
  • $_FILES["uploadfile"]["error"] - Код ошибки, которая может возникнуть при загрузке файла. Ключ ["error"] был добавлен в PHP 4.2.0.

Обратите внимание : после окончания работы скрипта загрузки файла на сервер - временный файл будет удален, поэтому необходимо скопировать этот файл из временной директории в какую-либо папку, например files при помощи функции copy() ; Не нужно применять функцию move(), так как у copy в этот момент есть 2 преимущества: временный файл самостоятельно удалиться, и если временный каталог находится на другом носителе - то выведется ошибка.

Подсказка : процесс должен начинаться по условию нажатия кнопки "Загрузить", то ест к примеру: if($_POST["submit"]){то выполняй действия}

Картинка, которая наглядно покажет 4 созданные переменные глобального массива $_FILES:

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

Примерно так может выглядеть сам скрипт:

if($_POST["submit"]){
@mkdir("files", 0777); // создаем папку, если ее нет то ошибки не будет, задаем права

/*echo "

";
print_r($_FILES);
echo "
";*/
$uploaddir = "files/";
$uploadfile = $uploaddir.basename($_FILES["uploadfile"]["name"]);

If(copy($_FILES["uploadfile"]["tmp_name"], $uploadfile)){
echo "

Файл успешно загружен на сервер

";
}else{
echo "

Не удалось загрузить файл на сервер

";
exit;
}

//Данные о загруженном файле
echo "

Информация о загруженном на сервер файле:

";
echo "

Оригинальное имя загруженного файла: ".$_FILES["uploadfile"]["name"]."

";
echo "

Mime-тип загруженного файла: ".$_FILES["uploadfile"]["type"]."

";
echo "

Размер загруженного файла в байтах: ".$_FILES["uploadfile"]["size"]."

";
echo "

Временное имя файла: ".$_FILES["uploadfile"]["tmp_name"]."

";
}

Вот так вот и происходит процесс загрузки файла на сервер средствами PHP.

Надеюсь было кому-либо полезно!

Эта статья также доступна на следующих языках: Тайский

  • Next

    Огромное Вам СПАСИБО за очень полезную информацию в статье. Очень понятно все изложено. Чувствуется, что проделана большая работа по анализу работы магазина eBay

    • Спасибо вам и другим постоянным читателям моего блога. Без вас у меня не было бы достаточной мотивации, чтобы посвящать много времени ведению этого сайта. У меня мозги так устроены: люблю копнуть вглубь, систематизировать разрозненные данные, пробовать то, что раньше до меня никто не делал, либо не смотрел под таким углом зрения. Жаль, что только нашим соотечественникам из-за кризиса в России отнюдь не до шоппинга на eBay. Покупают на Алиэкспрессе из Китая, так как там в разы дешевле товары (часто в ущерб качеству). Но онлайн-аукционы eBay, Amazon, ETSY легко дадут китайцам фору по ассортименту брендовых вещей, винтажных вещей, ручной работы и разных этнических товаров.

      • Next

        В ваших статьях ценно именно ваше личное отношение и анализ темы. Вы этот блог не бросайте, я сюда часто заглядываю. Нас таких много должно быть. Мне на эл. почту пришло недавно предложение о том, что научат торговать на Амазоне и eBay. И я вспомнила про ваши подробные статьи об этих торг. площ. Перечитала все заново и сделала вывод, что курсы- это лохотрон. Сама на eBay еще ничего не покупала. Я не из России , а из Казахстана (г. Алматы). Но нам тоже лишних трат пока не надо. Желаю вам удачи и берегите себя в азиатских краях.

  • Еще приятно, что попытки eBay по руссификации интерфейса для пользователей из России и стран СНГ, начали приносить плоды. Ведь подавляющая часть граждан стран бывшего СССР не сильна познаниями иностранных языков. Английский язык знают не более 5% населения. Среди молодежи — побольше. Поэтому хотя бы интерфейс на русском языке — это большая помощь для онлайн-шоппинга на этой торговой площадке. Ебей не пошел по пути китайского собрата Алиэкспресс, где совершается машинный (очень корявый и непонятный, местами вызывающий смех) перевод описания товаров. Надеюсь, что на более продвинутом этапе развития искусственного интеллекта станет реальностью качественный машинный перевод с любого языка на любой за считанные доли секунды. Пока имеем вот что (профиль одного из продавцов на ебей с русским интерфейсом, но англоязычным описанием):
    https://uploads.disquscdn.com/images/7a52c9a89108b922159a4fad35de0ab0bee0c8804b9731f56d8a1dc659655d60.png