Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Экзамен / web / example1 / Введение в PHP.doc
Скачиваний:
103
Добавлен:
18.05.2015
Размер:
3 Mб
Скачать

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

Загрузка файлов может быть реализована при помощи специальной формы:

<!—appload.htm 

<form enctype="multipart/form-data" action="appload.php.php" method="post">

<input name="userfile" type="file" />

<input type="submit" value="Загрузить" />

</form>

В приведенной форме параметр "action.php" - ссылка на PHP-скрипт. В атрибутах формы указано enctype="multipart/form-data", иначе загрузка файлов на сервер выполняться не будет. При нажатии на кнопку "Загрузить" появляется окно с перечнем файлов, из которых выбирается один загружаемый. Суперглобальный массив $_FILES содержит информацию о загруженном файле ‘userfile’:

Имя файла на компьютере клиента: $_FILES['userfile']['name']; Mime-тип файла: $_FILES['userfile']['type']; Размер в байтах принятого файла: $_FILES['userfile']['size'];

Временное имя, с которым файл был сохранен на сервере: $_FILES['userfile']['tmp_name']; Код ошибки, которая может возникнуть при загрузке файла: $_FILES['userfile']['error']

По умолчанию принятые файлы сохраняются на сервере в стандартной временной папке, если не задана другая директория при помощи изменения директивы upload_tmp_dir=/tmp конфигурационного файла php.ini. В следующем примере принимается и обрабатывается загруженный при помощи формы файл.

<?php //appload.php

$name=basename($_FILES['userfile']['name']);

print "<pre>";

if (copy($_FILES['userfile']['tmp_name'], $name)) {

print "File was successfully uploaded. ";

print "Here's some debugging info:\n";

print_r($_FILES);

}

else {

print "Possible file upload attack! Here's some debugging info:\n";

print_r($_FILES);

}

print "</pre>";

echo "Информация о временном файле:", "<br>";

echo $_FILES['userfile']['name'],"<br>";

echo $_FILES['userfile']['size'],"<br>";;

echo $_FILES['userfile']['tmp_name'],"<br>";

echo $_FILES['userfile']['type'],"<br>";

?>

Вывод:

File was successfully uploaded. Here's some debugging info:

Array

(

[userfile] => Array

(

[name] => Проекты.txt

[type] => text/plain

[tmp_name] => Y:\tmp\phpD9.tmp

[error] => 0

[size] => 1421

)

)

Информация о временном файле

Проекты.txt

1421

Y:\tmp\phpD9.tmp

text/plain

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

Если при отправке формы файл выбран не был, PHP установит переменную $_FILES['userfile']['size'] в значение 0, а переменную $_FILES['userfile']['tmp_name'] - в none.

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

Папка uploadfilesдля загузки не существует. Пожалуйста, создайте папку Y:\home\localhost\www\BookEx/uploadfiles

Повторите попытку загрузить файл.

<? //app7.php

$path=GetCWD()."/uploadfiles";

if(!file_exists($path))

die("<b>Папка uploadfilesдля загузки не существует. Пожалуйста, создайте папку

<font color=red>".$path."</font> <br>

<a href=?>Повторите попытку загрузить файл</a>.</b>");

if(empty($_FILES['UserFile']['tmp_name']))

echo

"<form method=post enctype=multipart/form-data>

Выберите файл: <input type=file name=UserFile>

<input type=submit value=Отправить>

</form>";

elseif(!is_uploaded_file($_FILES['UserFile']['tmp_name']))

die("<b><font color=red>Файл не был загружен! Попробуйте <a href=?>повторить попытку</a>!</font></b>");

else

{

if(@!copy($_FILES['UserFile']['tmp_name'],$path.chr(47).$_FILES['UserFile']['name']))

die("<b><font color=red>Файл не был загружен! Попробуйте <a href=?>повторить попытку</a>!</font></b>");

else

echo "<center><b>Файл \"<font color=red>" .$_FILES['UserFile']['name'].

"\" </font> успешно загружён на сервер!</font></b></center>".

"<hr>"."Тип файла: <b>" . $_FILES['UserFile']['type'] ."</b><br>"."Размер файла: <b>" .round($_FILES['UserFile']['size']/1024,2).

" кб.</b>"."<hr><center><a href=?>

Загрузить ещё один файл!</a></center>";

}

?>

Вывод:

Файл "Денвер.docx" успешно загружён на сервер!

Тип файла: application/vnd.openxmlformats-officedocument.wordprocessingml.document

Размер файла: 20.51 кб.

Загрузить ещё один файл!

Здесь функция getcwd() возвращает имя текущего каталога.

Загрузка файла и просмотр содержимого

<?php //app9.php

echo

"<form method=post enctype=multipart/form-data>

Выберите файл: <input type=file name=myfile>

<input type=submit value=Открыть файл>

</form>";

if(isset($_FILES["myfile"]))

{

$myfile = $_FILES["myfile"]["tmp_name"];

$myfile_name = $_FILES["myfile"]["name"];

$error_flag = $_FILES["myfile"]["error"];

// Если ошибок не было

if($error_flag == 0)

{

print("Имя временного файла на сервере: ".$myfile."<br>");

print("Имя загружаемого файла на компьютере пользователя: ".$myfile_name."<br>");

// Получаем содержимое файла

$fp = fopen($myfile,"r");

$content = fread($fp, filesize($myfile));

fclose($fp);

// Вывод содержимого файла

print($content);

} // end of if 2

} // end of if 1

?>

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

Значения $_FILES["myfile"]["error"]: 0 - ошибок не было, файл загружен; 1 - размер загруженного файла превышает размер установленный параметром upload_max_filesize в php.ini; 2 - размер загруженного файла превышает размер установленный параметром MAX_FILE_SIZE в HTML форме; 3 - загружена только часть файла; 4 - файл не был загружен (в форме указан неверный путь к файлу).

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

copy ( string source, string dest);

Функция copy() копирует файл source в место назначения dest.

Функция move_uploaded_file ( string filename, string destination); перемещает загруженный файл filename в место назначение указанное в параметре destination.

При одновременной загрузке двух файлов HTML форма содержит:

<INPUT NAME="myfile1" TYPE="file">

<INPUT NAME="myfile2" TYPE="file">

Это пример для одновременной загрузки двух файлов.

Таким же образом можно загружать и двоичные файлы, например файлы картинок gif, jpeg и т.д. При этом загружаемые на сервер бинарные файлы могут оказаться "битыми": фотки не будут показываться, программы не запустятся, архивы не распакуются. Дело в том, что Апач веб-сервер перекодирует все подряд. Например, символ с кодом 0х00 он заменяет на пробел (символ с кодом 0х20). Чтобы выключить эту ненужную перекодировку, допишите в любое место файла httpd.conf из каталога Апачи (/usr/local/apache) следующие строки.

<Location />

CharsetRecodeMultipartForms Off

</Location>

Соседние файлы в папке example1