PHP. Загрузка файлов на сервер |
||||
---|---|---|---|---|
Здесь будет рассмотрена загрузка файлов на сервер по протоколу HTTP. Рассмотрим два варианта конфигурации PHP: register_globals=On - все
параметры передаваемые скрипту, автоматически становятся глобальными
переменными. register_globals=Off - параметры передаваемые
скрипту заносятся в массивы $_GET, $_POST, $_FILES, $_COOKIE, ...
Upload файлов при register_globals=On <html> <body> <FORM ENCTYPE="multipart/form-data" ACTION="myup.php" METHOD=POST> Выберете файл: <INPUT NAME="myfile" TYPE="file"> <INPUT TYPE="submit" VALUE="Загрузить"> </FORM> </body> </html> После того как пользователь выбрал имя файла и нажал кнопку Загрузить, PHP
помещает загружаемый файл во временную директорию указанную в параметре
upload_tmp_dir файла php.ini. В этой директории этот файл будет храниться только
во время запроса! После запроса PHP удалит этот временный файл. Поэтому
загружаемый файл нужно куда-нибудь переместить (если он вам понадобиться в
дальнейшем). Явно удалить временный файл можно функцией unlink(string filename).
<?php // Загрузка файлов на сервер // Если register_globals=On print("Имя файла на нашем сервере (во время запроса): ".$myfile."<br>"); print("Имя файла на компьютере пользователя: ".$myfile_name."<br>"); print("MIME-тип файла: ".$myfile_type."<br>"); print("Размер файла: ".$myfile_size."<br><br>"); // Получаем содержимое файла $fp = fopen($myfile,"r"); $content = fread($fp, filesize($myfile)); fclose($fp); // Вывод содержимого файла print($content); ?> Пояснения: Upload файлов при register_globals=Off <?php // Загрузка файлов на сервер // Если register_globals=Off // Если upload файла if(isset($_FILES["myfile"])) { $myfile = $_FILES["myfile"]["tmp_name"]; $myfile_name = $_FILES["myfile"]["name"]; $myfile_size = $_FILES["myfile"]["size"]; $myfile_type = $_FILES["myfile"]["type"]; $error_flag = $_FILES["myfile"]["error"]; // Если ошибок не было if($error_flag == 0) { print("Имя файла на нашем сервере (во время запроса): ".$myfile."<br>"); print("Имя файла на компьютере пользователя: ".$myfile_name."<br>"); print("MIME-тип файла: ".$myfile_type."<br>"); print("Размер файла: ".$myfile_size."<br><br>"); // Получаем содержимое файла $fp = fopen($myfile,"r"); $content = fread($fp, filesize($myfile)); fclose($fp); // Вывод содержимого файла print($content); } // end of if 2 } // end of if 1 ?>При загрузке можно проверять размер файла ($myfile_size) и если его размер превышает требуемый, то вывод файла не производить. Значения $_FILES["myfile"]["error"]: 0 - ошибок не было, файл загружен. 1 - размер загруженного файла превышает размер установленный параметром upload_max_filesize в php.ini 2 - размер загруженного файла превышает размер установленный параметром MAX_FILE_SIZE в HTML форме. 3 - загружена только часть файла 4 - файл не был загружен (Пользователь в форме указал неверный путь к файлу). Если вам необходимо сохранить загруженный файл, то это можно сделать с помощью функций: copy ( string source, string dest); move_uploaded_file ( string filename, string destination); Функция copy() копирует файл source в место назначения dest. <INPUT NAME="myfile1" TYPE="file"> <INPUT NAME="myfile2" TYPE="file"> <INPUT NAME="myfile3" TYPE="file"> массив $_FILES[] будет иметь следующую структуру:
Попробуйте аплодить таким способом на сервер бинарные файлы. Скорее всего файлы окажутся "битыми": фотки не будут показываться, программы не запустятся, архивы не распакуются. Текстовые файлы (почти точно) не повредятся. Дело в том, что Русский Апач (ваш веб-сервер) перекодирует все подряд. Например, символ с кодом 0х00 он заменяет на пробел (символ с кодом 0х20). Чтобы выключить эту ненужную перекодировку, допишите в файл httpd.conf из каталога Апача (/usr/local/apache) следующие строки. Если у вас нет доступа к этому файлу и админ сервера не может сделать это за вас, ткните его в эти строки. <Location /> CharsetRecodeMultipartForms Off </Location> Строку CharsetRecodeMultipartForms Off можно добавлять в разные места (один раз). Если вы совсем начинающий пользователь и не решите сами, куда писать эту строку, будьте аккуратнее при решении задачи методом тыка. |