Пример загрузки файлов на сервер (upload) на языке php. Загрузка файлов с помощью PHP Php загружаются файлы на сервер

На 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.

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

27.12.16 19K

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

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

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

Basic File Upload

Basic File Upload


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

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

.

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

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

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

Basic File Upload

Basic File Upload


Пожалуйста, не тестируйте этот 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 ). Давайте познакомимся с этими элементами поближе:

  1. name: содержит название загруженного пользователем файла. Если вы загрузите файл abc.txt в браузер, то элемент name получит название abc.txt ;
  2. type: тип загруженного файла или mime-type , если точнее. Для файла JPG этот элемент будет иметь значение image/jpeg . Если загрузить текст, то элемент получит значение text/plain . Для разных типов файлов разным будет и mime-type . Ниже приведены самые распространенные mime-типы :
  • JPEG: image/jpeg ;
  • PNG: image/png ;
  • Текст: text/plain ;
  • Word: application/msword .
  1. tmp_name: временное расположение для загруженного файла. Этот путь можно изменить в переменной upload_tmp_dir , указанной в файле php.ini .
  1. 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) . Невозможно записать файл на диск.
  1. 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


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

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

  1. Используя разные имена Input .
  2. Используя одно и то же имя 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



2. Используем одно поле input, но с применением массива:

Как и в случае с другими типами input , для move uploaded file PHP мы можем использовать массив с input type , указанным в php . То есть:

То есть, для приведенного выше HTML , $_FILES предоставит данные со следующей структурой:

Array ( => Array ( => Array ( => upload-file-php.jpg => variable-scope-php.jpg => magic-constants.jpg) => Array ( => image/jpeg => image/jpeg => image/jpeg) => Array ( => /Applications/XAMPP/xamppfiles/temp/phpML5kOy => /Applications/XAMPP/xamppfiles/temp/phpNZbuw7 => /Applications/XAMPP/xamppfiles/temp/phpO8VFAk) => Array ( => 0 => 0 => 0) => Array ( => 6887 => 8036 => 9967)))

Скачать код, использованный в статье

Данная публикация представляет собой перевод статьи «File Upload With PHP Script » , подготовленной дружной командой проекта

Хорошо Плохо

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

Загрузка файлов на сервер средствами 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

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


Http://localhost/index.php?name=myname&page=10

определяет запрос GET к странице index.php. При этом скрипту передаются параметры "name" и "page" со значениями "myname" и "10" соответственно. Как видите, запрос состоит из пар "имя=значение", объединённых через "&". Запрос отделяется от адреса страницы знаком вопроса "?".

Но GET не подходит для передачи больших данных. Для этого существует метод POST. Этот метод передаёт данные скрыто от пользователя, а адрес страницы остаётся неизменным. Теоретически, метод POST позволяет передавать огромные блоки данных, но большинство провайдеров устанавливают жесткое ограничение в 5-10 мегабайт.

Для реализации загрузки файла необходимо снабдить пользователя соответствующей формой. Для загрузки файлов предназначен тег input типа file.

Выберите файл для загрузки:

Пользователь выбирает нужный файл, нажимает кнопку "Отправить!", после чего браузер передаёт указанный файл на сервер. По окончании загрузки файла запускается receiver.php, и ему автоматически становятся доступны все переданные в форме данные.

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

3145728) { $filesize = ($filesize != 0)? sprintf("(%.2f Мб)" , $filesize / 1024): ""; die("Ошибка: Размер прикреплённого файла ". $filesize." больше допустимого (3 Мб)."); } else { $filename = $_FILES["file"]["name"]; $filepath = $_FILES["file"]["tmp_name"]; $filetype = $_FILES["file"]["type"]; if($this->filetype == null || $this->filetype == "") $this->filetype = "unknown/unknown"; } } } echo "Успешно загружен файл: " . $filename; ?>

Все загруженные файлы сохраняются сервером во временном каталоге и автоматически удаляются после завершения скрипта. Если вам необходимо сохранить файл на сервере - его надо переместить в один из каталогов сайта. Для этого служит специальная функция move_uploaded_file() . Обчно она используется в паре с функцией is_uploaded_file() , которая позволяет определить, был ли файл загружен через форму. Например:

Информация о каждом загруженном файле представляется в скрипте как элемены массива $_FILES. Имя элемента определяется атрибутом name тега формы. В нашем случае атрибут name равен "ufile", значит данные об этом файле будут храниться в элементе $_FILES["ufile"].

Каждый элемент $_FILES так же является массивом, содержащим пять элементов с фиксированными именами:

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

У Вас в браузере заблокирован JavaScript. Разрешите JavaScript для работы сайта!

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

Краткий эксурс в upload

Что такое Upload files, или почему не работает
copy ("c:\images\sample.jpg", "http://mysite.ru/uploads/sample.jpg ")

Даже если у Вас в распоряжении всего один компьютер, на котором совмещен и сервер и рабочая станция, не стоит забывать о том, что php использует технологию клиент/сервер. Файл, который мы хотим загрузить, как правило, находится на машине клиента, т.е. пользователя, обыкновенного посетителя сайта. Место назначения - сервер. Для того чтобы совершить процесс передачи файла, нам понадобиться следующая форма:

Send this file:

При этом в поле action должен быть указан URL Вашего php-скрипта, который в дальнейшем будет заниматься обработкой загружаемых файлов. Скрытое поле MAX_FILE_SIZE должно предшествовать полю выбора файла, и содержать максимально допустимый размер файла в байтах. Его назначение - проверка размера файла еще до момента отправки файла на сервер. Это должно избавить пользователя от длительной и безрезультатной загрузки файла на сервер и образования лишнего трафика, но не стоит особо полагаться на это ограничение, так как его легко обойти.

Что происходит, когда пользователь выбрал файл на своем диске, и нажал на кнопку "Send file"? Браузер отсылает файл на сервер, где php-интерпретатор помещает его в свою временную директорию, присваивая ему случайное имя и выполняет скрипт, указанный в поле action.

Как должен выглядеть upload.php?

$uploaddir = "/var/www/uploads/"; if (move_uploaded_file($_FILES["userfile"]["tmp_name"], $uploaddir. $_FILES["userfile"]["name"])) { print "File is valid, and was successfully uploaded."; } else { print "There some errors!"; }

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

  • $_FILES["userfile"]["name"] - оригинальное имя файла, такое, каким его видел пользователь, выбирая файл;
  • $_FILES["userfile"]["type"] - mime/type файла, к примеру, может быть image/gif; это поле полезно сохранить, если Вы хотите предоставлять интерфейс для скачивания загруженных файлов;
  • $_FILES["userfile"]["size"] - размер загруженного файла;
  • $_FILES["userfile"]["tmp_name"] - полный путь к временному файлу на диске;
  • $_FILES["userfile"]["error"] - Начиная с версии 4.2.0, содержит код ошибки, который равен 0, если операция прошла успешно.

Для PHP версии ниже 4.1.0 этот массив называется $HTTP_POST_FILES. Не стоит забывать, что в отличие от $_FILES этот массив не является суперглобальным и при обращении к нему, к примеру, из функции, необходимо явно указывать global $HTTP_POST_FILES;

Если в настройках Вашего сервера register_globals=on, будут созданы дополнительные переменные вида $userfile_name, $userfile_type, $userfile_size… Учитывая, что, начиная с версии 4.2.0, в настройках по умолчанию register_globals=off использования этих переменных не рекомендовано, даже если они определены. Лучший способ получения информации о загружаемых файлах - использовать массив $_FILES.

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

Настройка сервера

Я все сделал правильно, но у меня что-то не работает. Может, у меня неправильно сконфигурирован сервер?

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

В файле php.ini:

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

В файле httpd.conf :

  • Прежде всего, убедитесь, что Вы используете веб-сервер Apache 1.3 (последняя версия на момент написания статьи - 1.3.27). Если Вы используете Apache 2.0, Вам следует прочитать следующий отрывок из документации:

    Do not use Apache 2.0 and PHP in a production environment neither on Unix nor on Windows.

  • Если Вы получили сообщение "POST Method Not Allowed", это означает, что надо искать что-то похожее на следующие директивы, и использовать ключевое слово Allow: Order allow,deny Allow from all
  • Проблемы с загрузкой бинарных файлов - классический вопрос "почему бьются файлы при upload". Вот способ решения, предложенный Димой Бородином (http://php.spb.ru): В директории, где лежит скрипт, делаем файл .htaccess , в котором пишем: CharsetDisable On В файл httpd.conf дописать строки: CharsetRecodeMultipartForms Off

Небольшие пояснения, к этому рецепту: вышеописанная проблема, когда загруженные на сервер архивы не распаковываются и картинки не отображаются, может возникать из-за того, что используется веб-сервер Russian Apache. Директива CharsetDisable отключает модуль charset-processing module, т.е. никакой перекодировки при скачивании файлов, находящихся в данной папке, происходить не будет. Директива CharsetRecodeMultipartForms выключает перекодировку данных, переданных методом POST с заголовком Content-Type: multipart/form-data. Т.е. двоичные данные, переданные с такой настройкой, будут оставлены в первоначальном виде, а все остальное наполнение сайта будет перекодировано согласно текущим настройкам сервера.

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

Используйте директиву CharsetRecodeMultipartForms, которая появилась в PL23, но при этом вам все-равно придется перекодировать вручную текстовые части запросов. Для этого можно использовать Russian Apache API, доступное в других модулях или Russian Apache Perl API, доступное из mod_perl.

Один из примеров определения кодировки вы можете найти тут: http://tony2001.phpclub.net/detect_charset/detect.phps

Самая свежая документация по Russian Apache находится на его официальном сайте: http://apache.lexa.ru/.

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

Также возможна настройка параметров Apach с помощью.htaccess:

Php_value upload_max_filesize 50M php_value post_max_size 50M

Дополнительные возможности

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

Пример формы загрузки нескольких файлов:

Send these files:


И не забудьте увеличить post_max_size , если предполагается много файлов

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

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

Хранение файлов в базе данных mySQL

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

  • Необходимо использовать поле типа BLOB
  • Перед тем, как класть в базу, не забыть применить к строке mysql_escape_string()
  • При отображении файла необходимо указывать заголовок content/type

Помните, что скрипт отображающий ваш HTML никак не связан со скриптом, который должен выводить изображение. Это должны быть два различные приложения.

Хранение картинок в базе не является хорошем стилем. Гораздо удобней хранить в базе лишь пути к файлам изображений.

Получение свойств изображения.

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

Загрузка файлов, имеющих русско-язычное название

При загрузке на сервер файлов, необходимо проверять их оригинальные имена на предмет наличия "нестандартных" символов (к примеру русских букв). В случае их присутствия необходимо произвести замену. Оригинальное имя файла можно найти в переменной $_FILES["userfile"]["name"]. Как перекодировать русскоязычную строку в транслит можно можно найти в примерах PHP .

Отображения статуса загрузки (Progress bar)

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

Права на файлы

Проблемы с правами на сервере (upload_tmp_dir)

В Unix-подобных операционных системах каждой папке, файлу, ссылке выставлены соответствие права доступа. Они могут выглядеть как rwx-rw-r- или же как число 754.

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

Владелец Группа Прочие (u) (g) (o) rwx rwx rwx

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

r Право на чтение. (4)
w Право на запись. (2)
x Право на выполнение (поиск в каталоге). (1)

  • Установить владельцем каталога пользователя, с чьими привелегиями выполняется apache. Это можно узнать из файла httpd.conf или просмотрев список процессов на сервере. Права на каталог должны быть 700 (rwx------).
  • Независимо от того, кто является владельцем каталога, установить права 777 (rwxrwxrwx).

    Пример реализации загрузки картинок на сервер.

    $max_image_width = 380; $max_image_height = 600; $max_image_size = 64 * 1024; $valid_types = array("gif","jpg", "png", "jpeg"); if (isset($_FILES["userfile"])) { if (is_uploaded_file($_FILES["userfile"]["tmp_name"])) { $filename = $_FILES["userfile"]["tmp_name"]; $ext = substr($_FILES["userfile"]["name"], 1 + strrpos($_FILES["userfile"]["name"], ".")); if (filesize($filename) > $max_image_size) { echo "Error: File size > 64K."; } elseif (!in_array($ext, $valid_types)) { echo "Error: Invalid file type."; } else { $size = GetImageSize($filename); if (($size) && ($size < $max_image_width) && ($size < $max_image_height)) { if (@move_uploaded_file($filename, "/www/htdocs/upload/")) { echo "File successful uploaded."; } else { echo "Error: moving fie failed."; } } else { echo "Error: invalid image properties."; } } } else { echo "Error: empty file."; } } else { echo "
    Send this file:
    "; }

    Оригинал статьи находится на сайте PHP Club


    Как скачать файл с сервера?
  • 
    Top