Поддержка метода PUT

PHP поддерживает HTTP-метод PUT, через который отдельные клиенты отправляют файлы на сервер для хранения. PUT-запросы проще, чем загрузка файлов POST-запросами, а выглядят PUT-запросы примерно так:

PUT /path/filename.html HTTP/1.1

Обычно такой вызов означает, что удалённый клиент хотел бы сохранить файл /path/filename.html в дереве каталогов веб-сервера. Не сомневаемся, что настраивать веб-сервер Apache или PHP так, чтобы они разрешали каждому автоматически перезаписывать файлы веб-сервера, — плохая идея. Поэтому, чтобы обработать такой запрос, потребуется сначала сообщить веб-серверу, чтобы запрос обрабатывал конкретный PHP-скрипт. На веб-сервере Apache это делается через директиву Script. Обычно директиву записывают в произвольном месте конфигурационного файла веб-сервера Apache внутри блока <Directory> или, возможно, внутри блока <VirtualHost>. Строка наподобие этой укажет веб-серверу конкретный PHP-файл для обработки запроса:

Script PUT /put.php

Строка говорит веб-серверу Apache перенаправлять каждый PUT-запрос к URI-идентификаторам, которые соответствуют контексту, в котором записали строку, в файл put.php. Предполагается, что файлы с расширением .php обрабатываются как PHP-скрипты, и что сам PHP активен. Ресурсом назначения для PUT-запросов к этому скрипту должен быть сам скрипт, а не имя, которое требуется дать загружаемому файлу.

Затем внутри файла put.php разработчик мог бы написать код наподобие следующего примера. Пример скопирует содержимое загруженного файла в файл myputfile.ext на сервере. Возможно, потребуются проверки и (или) аутентификация пользователя перед копированием файла.

Пример #1 Сохранение файлов, которые отправили HTTP-методом PUT

<?php

/* PUT-данные приходят в стандартный поток входных данных stdin */
$putdata = fopen("php://input", "r");

/* Открываем файл для записи */
$fp = fopen("myputfile.ext", "w");

/* Читаем 1 KB данных за один раз
и записываем в файл */
while ($data = fread($putdata, 1024)) {
fwrite($fp, $data);
}

/* Закрываем потоки */
fclose($fp);
fclose($putdata);

?>