В этой статье достаточно полно рассказывается о широко используемом методе загрузки файлов на сервер методом POST.
Нам понадобится: html страничка с формой для выбора файла, любой браузер, поддерживающий стандарт RFC-1867 (сейчас браузер без этого найти трудно:) и, собственно, php-скрипт, который будет обрабатывать и сохранять наш файл.
Код формы html-странички (для ):
<form enctype="multipart/form-data" action="upload.php" method="post"> <input type="hidden" name="MAX_FILE_SIZE" value="50000" /> Выбери файл: <input name="userfile[]" type="file" /> <input name="userfile[]" type="file" /> <input name="userfile[]" type="file" /> <input type="submit" value="Загрузить" /> </form>
Поясним:
Теперь создадим скрипт upload.php, принимающий файлы на сервере:
<? $path_to_files = './files/'; // путь для сохранения файлов // если у нас несколько полей userfile[], // отметаем те, в которые ничего не было выбрано $good_name = array_filter($_FILES['userfile']['name']); if (sizeof($good_name) != 0) { // если массив файлов не пустой foreach ($good_name as $key => $name) { $type = $_FILES['userfile']['type'][$key]; $tmp_name = $_FILES['userfile']['tmp_name'][$key]; $size = $_FILES['userfile']['size'][$key]; // эта функция проверяет был ли загружен файл во временную директорию php if (!is_uploaded_file($tmp_name)) { echo "An error happened while loading. Failed."; continue; } // выковыриваем имя и расширение файла - $file_ext = substr($name, 1 + strrpos($name, ".")); // - это может понадобиться, например, для сохранения в базу данных $file_name = substr($name, 0, strrpos($name, ".")); // делаем реальный путь в файловой системе $real_path = realpath($path_to_files); // создаем в нашей директории временный файл с уникальным именем, // это делается для того, чтобы избежать одновременного // закачивания файлов с одним именем $temp_file_name = tempnam($real_path, "UPLF"); // делаем новое, более привлекательное, имя файла для хранения на сервере $file_name = $temp_file_name."original.".strtolower($file_ext); // переносим загруженный временный файл в файл со // сделанным нами уникальным именем if (move_uploaded_file($tmp_name, $file_name)) { echo "Saved!"; unlink($temp_file_name); // удаляем временный файл }else { echo "Failed!"; continue; } } }else { echo "No files were loaded."; } ?>
Поясним:
После нажатия кнопки "Submit" в форме происходит загрузка файла на сервер - PHP-скрипт помещает файл во временную системную директорию (после окончания скрипта файл автоматически удаляется). Доступ к этим файлом и информарции о них можно получить через глобальный массив $_FILES (используется начиная с версии PHP 4.1.0, раньше был $HTTP_POST_FILES)
Этот массив имеет структуру вида:
Кроме того, о чем мы уже сказали, следует учитывать конфигурационные настройки PHP (смотрите ваш php.ini файл):
Настройки Apache:
Если вы все сделали правильно, но получаете что-нибудь вроде POST Method Not Allowed, возможно у вас неправильно сконфигурирован Apache. Ищите в файле httpd.conf строки похожие на:
<Limit POST> Order allow,deny Allow from all </Limit>
Здесь ключевым словом является allow. Измените найденные строки на приведенный фрагмент, или, если не нашли, допишите фрагмент в httpd.conf.
Часто возникает проблема с тем, что загруженные бинарные файлы (картинки, видео и т.д.) оказываются битыми. Это может быть связано с автоматическим перекодированием поступающих данных сервером Apache (в частности это наблюдалось в Russian Apache). Есть несколько способов отменить перекодировку:
<Location /> CharsetRecodeMultipartForms Off </Location>
Директива CharsetRecodeMultipartForms отвечает за перекодировку данных, полученных POST-методом с заголовком Content-Type: multipart/form-data. Таким образом, все двоичные данные будут оставлены в первоначальном виде. Но при этом может возникнуть необходимость перекодировать текстовую часть запроса вручную, будьте внимательны.
Комментарии
Спасибо за урок, но вот объясните мне, что это за лажа:
Parse error: parse error, unexpected $end in x:\home\localhost\www\...\n.php on line 53
Скорее всего просто опечатка.
Чтобы сказать точно - нужно смотреть n.php
Спасибо за статью. А подскажите как грамотно вытащить имена загруженных файлов ?
в какой момент вытащить?
после сабмита формы все данные (в т.ч. имена) загруженных файлов хранятся в $_FILES['userfile']['name'], а имена временных файлов в $_FILES['userfile']['tmp_name']
имел в виду именно имена загруженных файлов. К примеру я загружаю несколько типов фалов из одной формы и нужны их имена для занесения БД (при чем количество загружаемых фалов меняется, от 2 до 4)...заранее благодарен...вроде они рядом, а цапнуть их не как не соображу.
хех....спс, уже разобрался сам, ответ не требуется. Ваша статья помогла в решении :) Ре$рект ресурсу !
Скажите все таки как вывести имена уже загруженных файлов?
Спасибо.....
Отправить комментарий