Работа с качени файлове
ЗадачаИскате да разрешите файловете да се качват на вашия уеб сървър и да се съхраняват в база данни.
РешениеПредложете на потребителя уеб формуляр, който включва поле за файл. Когато потребителят изпрати формуляра, извлечете файла и го запазете в 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"
Качен е файл
Файлът не беше качен
Ако приемем, че файлът е зареден, получаваме достъп до атрибута на стойностния параметър, за да прочетем файла и да получим съдържанието му: