Работа с качени файлове

ЗадачаИскате да разрешите файловете да се качват на вашия уеб сървър и да се съхраняват в база данни.

РешениеПредложете на потребителя уеб формуляр, който включва поле за файл. Когато потребителят изпрати формуляра, извлечете файла и го запазете в MySQL.

ДискусияСпециален вид уеб въвеждане е качването на файл. Файлът се изпраща като част от POST заявката, но се обработва по различен начин от другите POST параметри, тъй като файлът е представен от няколко части от информация: съдържание, MIME тип, оригинално име на файла на клиента и име за временно съхранение на хоста на уеб сървъра.

За да обработите качения файл, трябва да изпратите специален формуляр до потребителя. Това важи за всеки API, в който се създава формуляр.

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

Имайте предвид, че MAX_FILE_SIZE е само препоръка и това ограничение може лесно да бъде заобиколено. За да зададете стойност, която не може да бъде надвишена, използвайте конфигурационния параметър upload_max_filesize в файла за инициализация на PHP. Освен това има параметър file_uploads, който определя основната възможност за качване на файлове.

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

• Започвайки с PHP 4.1, качените файлови данни от POST заявка се поставят в специален масив $_FILES, който включва запис за всеки качен файл. Всеки запис е масив от четири елемента. Например,ако формулярът съдържа файлово поле с име upload_file и потребителят качи файл, информацията за него е налична в следните променливи:

$_FILES["upload_file]["name"] оригинално име на файл на клиентски хост $_FILES["upload_file]["tmp_name"] временно име на файл на сървърен хост $_FILES["upload_file]["size"] размер на файла в байтове $_FILES["upload_file]["type"] MIME тип файл

Бъдете внимателни, защото записът за полето за качване може да съществува дори ако потребителят не е качил файл. Тогава стойността на tmp_name ще бъде празният низ или низът none.

• В по-ранните версии на PHP 4 информацията за качените файлове се съхраняваше в масива $HTTP_POST_FILES, чиито записи бяха подредени по същия начин както в $_FILES. Информацията за файла, изпратен от полето upload_file, е налична в следните променливи:

$HTTP_POST_FILES["upload_file]["name"] оригинално име на файл на клиентски хост $HTTP_POST_FILES["upload_file]["tmp_name"] временно име на файл на сървърен хост $HTTP_POST_FILES["upload_file]["size"] размер на файла в байтове $HTTP_POST_FILES["upload_file]["type" ] MI ME тип на файла

• Преди PHP 4 полето upload_file беше достъпно чрез четири променливи $HTTP_POST_VARS:

$HTTP_POST_VARS["upload_file_name"] оригинално име на файл на клиентски хост $HTTP_POST_VARS["upload_file"] временно име на файл на сървърен хост $HTTP_POST_VARS["upload_file_size"] размер на файла в байтове $HTTP_POST_VARS["upload_file_type"]

Типът MIME на файла $_FILES е суперглобален масив (глобален във всеки обхват). $HTTP_POST_FILES и $HTTP_POST_VARS трябва да бъдат декларирани с глобалната ключова дума, когато се използват извън глобалния обхват, като например във функция.

Не дагубейки време в опити да разберете кой масив съдържа информация за качените файлове, има смисъл да напишете функция, която върши цялата работа. Функцията get_upload_info() приема аргумент, съответстващ на името на полето на файла, който се качва. След това сканира масивите $_FILES, $HTTP_POST_FILES и $HTTP_POST_VARS и връща асоциативен масив от файлова информация или незададена стойност, ако информацията не е налична. При успешно повикване ключовете на елементите на масива ще бъдат "tmp_name", "name", "size" и "type" (т.е. ключовете съвпадат с ключовете на записи в масивите $_FILES или $HTTP_POST_FILES).

функция get_upload_info ($name) глобални $HTTP_POST_FILES, $HTTP_POST_VARS; незададено($незададено); # Първо потърсете информацията в масива $_FILES на PHP 4.1. # Проверете елемента tmp_name, за да се уверите, че файлът съществува. # (Записът в $_FILES може да присъства дори ако файлът не е зареден.) if (isset ($_FILES)) if (isset ($_FILES[$name]) && $_FILES[$name]["tmp_name"] != "" && $_FILES[$name]["tmp_name"] != "няма") връщане($_FILES[$name]); връщане (@$unset); > # След това потърсете информацията в PHP 4 масива $HTTP_POST_FILES. if (isset ($HTTP_POST_FILES)) if (isset ($HTTP_POST_FILES[$name]) && $HTTP_POST_FILES[$name]["tmp_name"] != "" && $HTTP_POST_FILES[$name]["tmp_name"] != "none") return ( $HTTP_POST_FILES[$name]); връщане (@$unset); > # Търсене на PHP променливи за зареждане 3. Проверете element_name, # защото $HTTP_POST_VARS[$name] може всъщност да не е файлово поле. if (isset ($HTTP_POST_VARS[$name]) && isset ($HTTP_POST_VARS[$name . "_name"])) # Съпоставяне на PHP 3 елементи към PHP 4 имена на елементи. $info = array (); $info["име"] =$HTTP_POST_VARS[$име. "_име"]; $info["tmp_name"] = $HTTP_POST_VARS[$name]; $info["size"] = $HTTP_POST_VARS[$name. "_размер"]; $info["type"] = $HTTP_POST_VARS[$name. "_type"];връщане($info); > връщане (@$unset); >

Скриптът post_image.php използва тази функция, за да извлече информация за изображението и да я съхрани в MySQL.

PHP конфигурационният параметър upload_tmp_dir указва къде се съхраняват качените файлове. По подразбиране на много системи е /tmp, но ако желаете, можете да промените настройките на PHP, за да се съхраняват в директория, притежавана от потребителя с ID на уеб сървъра, като съответно ограничите достъпа до него.

PythonПрост формуляр за качване на Python може да бъде написан по следния начин:

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

form = cgi.FieldStorage() if form.has_key("upload_file") and form["upload_file"].filename != "": image_file = form["upload_file"] else: image_file = Няма

form = cgi.FieldStorage() ако form.has_key("upload_file") и form["upload_file"].filename: print"

Качен е файл

Файлът не беше качен

Ако приемем, че файлът е зареден, получаваме достъп до атрибута на стойностния параметър, за да прочетем файла и да получим съдържанието му: