Множество качвания на php файлове. Пример за качване на файлове на сървъра (upload) в PHP

Многокомпонентни форми

  • Уеб интерфейси на пощенски услуги, които ви позволяват да добавите прикачен файл (прикачване) към писмо, като за да направите това, първо трябва да качите файла на сървъра и едва след това той може да бъде добавен към писмото;
  • Интерактивни фото галерии и фото албуми, които не могат да съществуват без механизъм за качване на файлове на сървъра;
  • Портали за безплатен софтуер, които се използват за обмен на файлове на различни програми и др.

Качването на файл на сървъра се извършва чрез формуляр от много части, който има поле за качване на файл. Параметърът enctype е зададен на multipart/form-data:



Ето как ще изглежда дадената многочастна форма (можете да опитате да я използвате, за да видите резултата от многочастните форми, като качите малък файл на сървъра):

Многочастните формуляри обикновено използват метода за подаване POST. Както можете да видите от предишния пример, този формуляр има две полета:

  • Поле за избор на файл за качване;
  • Поле за посочване на името на файла, който ще има на сървъра.

Обработка на формуляри от много части

Преди да започнете да пишете скрипт за обработка на многочастен формуляр, трябва да редактирате конфигурационния файл php.ini, за да позволите файловете да бъдат качени на сървъра.

PHP конфигурационният файл php.ini има три параметъра, свързани с качването на файлове на сървъра:

  • file_uploads=Включено - позволява качване на файлове на сървъра чрез HTTP;
  • upload_tmp_dir=/tmp - задава директорията за временно съхранение на качените файлове;
  • upload_max_filesize=2M - задава максималния размер на качените файлове.

Ако вашият уеб сървър работи с операционна система Linux, тогава трябва да рестартирате услугата:

услуга httpd рестартиране

Как PHP обработва формуляри от много части? След като получи файла, той го записва във временна директория, наречена upload_tmp_dir, с произволно избрано име на файла. След това създава четири суперглобални масивни променливи $_FILES. Този масив съдържа информация за изтегления файл.

Променливите, дефинирани за качените файлове, зависят от версията на PHP и текущата конфигурация. Суперглобалният масив $_FILES е наличен от PHP 4.1.0. В случай че конфигурационната директива register_globals е зададена на На, допълнително ще бъдат декларирани променливи с подходящи имена. От версия 4.2.0 стойността по подразбиране за опцията register_globals е изключено.

Съдържанието на масива $_FILES за нашия пример е показано по-долу. Обърнете внимание, че това предполага, че името uploadfile се използва за полето за избор на файл, както е в съставната форма по-горе. Разбира се, името на полето може да бъде всяко.

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

След като скриптът приключи, временният файл ще бъде изтрит. Това означава, че трябва да го копираме на друго място, преди скриптът да завърши. Тоест алгоритъмът за скрипта за качване на файл на сървъра е следният:

Ако се натисне бутонът "Изпращане", файлът вече ще бъде качен на сървъра и името му ще бъде в променливата $_FILES["uploadfile"]["name"]. В този случай скриптът трябва незабавно да копира файл с име $_FILES["uploadfile"]["tmp_name"] в някаква директория (изискват се разрешения за запис в тази директория).

Файлът се копира с помощта на функцията copy():

Използвайте само функцията за копиране copy(), а не функцията за преместване, защото:

  • Временният файл ще бъде изтрит автоматично;
  • Ако временната директория е на друг носител, ще се покаже съобщение за грешка.

Да кажем, че трябва да качим файл в директорията за качвания, която се намира в основната директория на уеб сървъра (в директорията DocumentRoot).

// Нека създадем директория за всеки случай. Ако вече е създаден,
// няма да видим съобщение за грешка, защото ще използваме оператора @:

@mkdir("качвания", 0777);

// Копирайте файла от /tmp в качвания
// Името на файла ще бъде същото като преди изпращане до сървъра:

Копиране ($_FILES["uploadfile"]["tmp_name"],"uploads/".basename($_FILES["uploadfile"]["name"]));

В Linux всичко е много по-сложно - трябва да вземем предвид разрешенията на директорията за качване. Най-вероятно в този случай функцията mkdir() няма да работи, тъй като нямаме разрешение за запис в директорията DocumentRoot (обикновено /var/www/html или /home/httpd/html). Влезте като root, създайте директория за качвания и променете нейния собственик и разрешения, както следва:

// Създайте директорията за качвания

// Задайте името на собственика на apache и неговата група - също apache:

Chown apache:apache качва

// Позволете на всички да пишат (777) + задайте лепкавия бит (1):

Chmod 1777 качвания

Размерът на файла може да бъде ограничен; ако желаете, можете да редактирате файла .htaccess и да ограничите достъпа до директорията за качвания - посочете или конкретни потребители, които имат достъп до директорията, или IP адреси.

Сега можете да качвате файлове на сървъра.

Писане на PHP скрипт за качване на файлове на сървъра

Зареждането на множество файлове може да се реализира, като се използват, например, различни стойности на име за тага за въвеждане.

Възможно е също автоматично получаване на информация, организирана в масив за няколко едновременно изтеглени файла. За да приложите тази функция, използвайте същия синтаксис за подаване на масив от HTML формуляр, както за множество полета за избор и квадратчета за отметка:


Изпратете тези файлове:






Ако е изпратен такъв формуляр, масивите $_FILES["userfile"], $_FILES["userfile"]["name"] и $_FILES["userfile"]["size"] ще бъдат инициализирани (в същото начин, като $HTTP_POST_FILES за PHP 4.1.0 и по-стари). Ако конфигурационната директива register_globals е настроена на , придружаващите глобални променливи също ще бъдат инициализирани. Всяка от тези променливи ще бъде числово индексиран масив от съответните стойности за получените файлове.

Да приемем, че файловете /home/test/some.html и /home/test/file.bin са заредени. В този случай променливата $_FILES["userfile"]["name"] ще има стойност some.html, а променливата $_FILES["userfile"]["name"] ще има стойност file.bin. По същия начин променливата $_FILES["userfile"]["size"] ще съдържа размера на файла some.html и т.н.

Променливи $_FILES["userfile"]["name"] , $_FILES["userfile"]["tmp_name"] , $_FILES["userfile"]["size"] и $_FILES["userfile"]["type "] също ще бъде инициализирано.

Заключение:

Както можете да видите, организирането на качване на файлове на сървъра не е толкова трудно. По-трудно е да се осигури необходимото ниво на сигурност, тъй като качването на файлове на сървъра може да се използва от нападателите за атака на сървъра. За информация как да осигурите необходимото ниво на сигурност при работа с качвания, вижте.



>
Ако имате други въпроси или нещо не е ясно - заповядайте при нас

В тази публикация искам да подчертая един интересен начин за качване на файлове на сървъра. Скриптът ще бъде напълно функционален и след известна адаптация може да бъде използван от вас във вашите проекти, ако разбира се имате интерес.

Да, този метод може да се нарече „AJAX качване на файлове на сървъра“, въпреки че не използва нито ActiveXObject, нито XMLHttpRequest, но това е, което по-късно се превърна в AJAX. Като цяло тук ще разкрия няколко трика за разработка, които ще бъдат доста добра находка за начинаещи.

Първо, методът използва динамично добавени/премахнати полета за качване на файлове (приложен списък с JavaScript) - т.е. Тази бележка обсъжда зареждането и обработката на неопределен брой файлове на сървъра и както винаги се опитвам да пиша възможно най-кратко и ясно.

Второ, разбира се, всичко ще се случи, точно без презареждане на страницата.

Трето, ще бъде даден сървърен скрипт, който получава данни, показва информация и обработва грешки при изтегляне на файлове

И четвърто, в края на изтеглянето на файлове на потребителя ще бъде показана информация за това кои файлове са изтеглени и кои не са и защо. Като цяло, ценно нещо в арсенала на разработчика.

Както вече знаем, когато пишете html формуляри, атрибутите “name” на елементите на формуляра впоследствие са ключовете на глобалните масиви: $_REQUEST $_GET или $_POST и ако във формуляра има две полета с един и същ атрибут “name” , тогава стойността на последното поле ще бъде „презаписана“ от стойностите на предишните в глобалния масив. Тези. ако имаме следното:

След това в скрипта за обработка ще видим масив $_FILES, който ще има само един ключ “upfile”, а стойността на първото поле с id="one" ще бъде презаписана.

Решението на този проблем е банално просто: ние даваме различни имена на атрибутите „name“ и „id“. Но! Какво става, ако полетата за качване на файлове трябва да се добавят динамично и броят им не е известен предварително? По правило програмистите предпочитат да генерират такива неща в цикъл, добавяйки определен цифров суфикс към атрибута „име“, като по този начин гарантират уникалността на атрибута „име“, а атрибутът id, с редки изключения, може почти винаги да бъде пропуснато (Запомнете DOM методите за достъп до елементи) Сървърният скрипт, генериращ формуляра, може да изглежда така:



Свързани публикации