|
Прехвърляне
на файлове в php
Методът
POST
Тази опция ще позволи
транспортирането както на текстови,
така и на файлове с друго съдържание.
Чрез функциите на PHP ще имате пълен
конгрол над това кой ще има право за
транспортиране на файлове, а също и над
това какво да бъде направено с
транспортираните файлове.
PHP е способно да
получава ъплоаднати файлове от всеки
браузер, който подържа RFC-1867 (което
включва Netscape Navigator 3 или следващите му
версии, Microsoft Internet Explorer 3 с разширение
от Microsoft или по-късните му версии).
Related Configurations Note:
вижте също така
file_uploads,
upload_max_filesize,
upload_tmp_dir,
post_max_size
и max_input_time
опциите в php.ini
PHP също поддържа PUT-
метода за ъплоадване на файлове, който
се използва от Netscape Composer и Amaya клиента
на W3C. Вижте PUT
Method Support за подробности.
|
Пример 1. Форма за ъплоадване на
файлове
|
Формата за ъплоадване на файлове може да изглежда нещо подобно:
|
<!-- Типът на енкодинга ТРЯБВА да бъде специфициран както е посочено по-надолу -->
<form enctype="multipart/form-data" action="__URL__" method="POST">
<!-- MAX_FILE_SIZE трябва да е преди полето за посочване на фаил -->
<input type="hidden" name="MAX_FILE_SIZE" value="30000" />
<!-- Името на входния елемент определя името в $_FILES array -->
Изпрати файла: <input name="userfile" type="file" />
<input type="submit" value="Send File" />
</form>
|
|
В случая
__URL__ трябва
да бъде заменено и насочено към
съответния .php файл.
|
|
Скритото
поле MAX_FILE_SIZE (размерът е в байтове)
трябва да предхожда полето за посочване
на файлове и неговата стойност определя
максималният размер на файловете,
които ще бъдат допуснати от php. Да се
заобиколи тази настройка от страна
на клиентската страна е съвсем лесно,
така че не бива да се разчита, че по
този начин е гарантирана максималната
големина на прехвърляните на сървъра
файлове. PHP настройките за максимален
размер на файловете обаче, не могат
да бъдат заобиколени. Този елемент на
формата е хубава да бъде използван,
за да предпази обикновения потребителя
от чакането за трансфер на файлове,
резултатът, от което ще бъде единствено
съобщението, че файлът е твърде голям,
за да бъде транспортиран.
|
|
Заблежка:
Във вашата форма за трансфер на файлове
задължително трябва да присъства
атрибута enctype="multipart/form-data",
в
противен случай трансфера няма да се
осъществи.
|
Общата
променлива $_FILES
съществува след PHP 4.1.0 (Вместо нея
използвайте $HTTP_POST_FILES
в по-ранни версии). Този масив ще съдържа
цялата информация за ъплоаднатате
файлове.
Съдържанието
на $_FILES
от примерната форма е показано по-надолу.
Обърнете внимание, че за име на
транспортирания файл се използва
userfile,
което е посочено в примерния скрипт
по-горе.
$_FILES['userfile']['name']
$_FILES['userfile']['type']
$_FILES['userfile']['size']
$_FILES['userfile']['tmp_name']
$_FILES['userfile']['error']
По
подразбиране транспортираните файлове
ще бъдат складирани в общата temp директория
на сървъра, с случай, че не бъде изрично
посочена друга чрез променливата
upload_tmp_dir
в php.ini.
Подразбиращата
се temp директория на сървъра може да бъде
променена чрез задаване на променливата
на средата TMPDIR,
в която PHP стартира. Ако я зададем
използвайки putenv()
вътре в скрипта, той няма да работи.
|
Пример 2.
Валидация на транспортирания файл.
|
|
Разгледайте
също така функциите is_uploaded_file()
и move_uploaded_file()
за повече информация. Последващия
пример обработва трансфера на файла
изхождащ от формата.
|
|
<?php // В
PHP версии, по-ранни от 4.1.0, ще трябва да
се изпозва $HTTP_POST_FILES вместо // of
$_FILES.
$uploaddir = '/var/www/uploads/'; $uploadfile =
$uploaddir . basename($_FILES['userfile']['name']);
echo
'<pre>'; if
(move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile))
{ echo "File is valid, and was
successfully uploaded.\n"; } else {
echo "Possible file upload attack!\n"; }
echo
'Here is some more debugging info:'; print_r($_FILES);
print
"</pre>";
?>
|
PHP
скриптът, който посреща транспортирания
файл описва каквато логика е необходима
за обработката на файла. Например можете
да използвате променливата
$_FILES['userfile']['size'],
за изхвърлите всички файлове, които са
или прекалено малки или прекалено
големи; променливата $_FILES['userfile']['type'],
за да отстраните файловете, които не
отговарят на определен критерий за типа
на файла (последната е добре да използвате
само като начало на серия от проверки,
защото стойността й е изцяло под контрола
на клиента и не се проверява на сървъра).
След PHP 4.2.0 можете да използвате
$_FILES['userfile']['error']
и да организирате логиката си в
съответствие с кодовете
за грешки. Така или иначе можете да
изберете дали да изтриете транспортирания
във временната директория файл или да
го преместите другаде.
Ако
във вашата форма не е посочен файл за
трансфер, PHP ще върне $_FILES['userfile']['size']
като 0 и $_FILES['userfile']['tmp_name']
като празна стойност.
След
края на заявката файлът във временната
директория ще бъде изтрит в случай, че
не е преместен другаде или преименуван.
|
Пример 3.
Транспортиране на масив от файлове.
|
|
PHP поддържа
опцията HTML
array feature също и с файлове.
|
<form action="" method="post" enctype="multipart/form-data">
<p>Pictures:
<input type="file" name="pictures[]" />
<input type="file" name="pictures[]" />
<input type="file" name="pictures[]" />
<input type="submit" value="Send" />
</p>
</form>
<?php foreach ($_FILES["pictures"]["error"]
as $key => $error) { if ($error ==
UPLOAD_ERR_OK) { $tmp_name =
$_FILES["pictures"]["tmp_name"][$key];
$name = $_FILES["pictures"]["name"][$key];
move_uploaded_file($tmp_name,
"data/$name"); } }
?>
|
|