igurbev.net



Прехвърляне на файлове в 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']

  • типът на файла – ако браузерът осигурява тази информация. Например може да бъде "image/gif". Така или иначе на сървъра не се извършва проверка за коректността на тези данни, така че не ги приемайте за сигурни.

$_FILES['userfile']['size']

  • размерът в байтове на транспортирания файл.

$_FILES['userfile']['tmp_name']

  • временно име на файла, с което той бива складиран на сървъра

$_FILES['userfile']['error']

  • Код за грешка асоцииран с трансфера. Този елемент е добавен в PHP 4.2.0

По подразбиране транспортираните файлове ще бъдат складирани в общата 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");
    }
}

?>







коментари




добави коментар
 име: