PHP マニュアル
前のページ | 第 38章ファイルアップロードの処理 | 次のページ

# PUT メソッドのサポート

PHP は、クライアントがサーバにファイルを保存するための HTTP PUT メソッドのサポートを提供します。 PUT リクエストは POST リクエストによるファイルアップロードよりもシンプルであり、 次のような形になります。

    PUT /path/filename.html HTTP/1.1

これは、通常、リモートクライアントが `/path/filename.html` が指す内容を Web ツリーに保存したいことを意味します。 Apache または PHP に おいて全ての人が Web ツリー上の任意のファイルを自動的に上書きできる ようにするというのは明らかに良い発想ではありません。よって、このような りクエストを処理する際には、まずそのリクエストを処理する特定の PHP スクリプトが必要なことを web サーバに通知する必要があります。 Apache においては、Script ディレクティブにより これを行うことができます。これは、Apache 設定ファイルのほぼ任意の 場所に置くことができます。一般的なのは、<Directory> ブロック または <Virtualhost> ブロックの中です。次のように指定します。

    Script PUT /put.php

これにより、この行を指定したコンテキストにマッチする URI を有する すべての PUT リクエストが put.php スクリプトに送られるよう Apache に 指定します。 もちろん、拡張子 .php により PHP が実行されるよう設定され、 PHP がアクティブであることが必要です。 このスクリプトに対するすべての PUT リクエストの対象リソースは、 スクリプト自身とします。アップロードされるファイルのファイル名ではありません。

PHP 4 以降では、put.php の中で以下のようなことを行います。 これは、アップロードされたファイルをサーバ上のファイル `myputfile.ext` にコピーします。 ファイルコピーを行う前には、 何らかの確認やユーザ認証を行いたくなるかもしれません。

例 38-5. PHP 4 で、HTTP PUT されたファイルを保存する

`<?php /* PUT されたデータは標準入力からやってきます */ $putdata = fopen("php://input", "r"); /* 書き込みモードでファイルをオープンします */ $fp = fopen("myputfile.ext", "w"); /* データを 1 KB 単位で読み込み、 ファイルに書き込みます */ while ($data = fread($putdata, 1024)) fwrite($fp, $data); /* ストリームを閉じます */ fclose($fp); fclose($putdata); ?>`

> 注意: これ以降のドキュメントは PHP 3 にのみ適用されます。

例 38-6. PHP 3 で、HTTP PUT されたファイルを保存する

`<?php copy($PHP_UPLOADED_FILE_NAME,$DOCUMENT_ROOT.$REQUEST_URI); ?>`

上記のスクリプトでは、PHP が PUT メソッドのリクエストを受けた際に POST メソッド と全く同様にテンポラリファイルにアップロードされたファイルを保存すると いうことを利用しています。リクエストが終了した際に、テンポラリファイルは 削除されます。よって、PUT を処理する PHP スクリプトは、この ファイルをどこかにコピーする必要があります。このテンポラリファイルの ファイル名は `$PHP_PUT_FILENAME` 変数に保持されており、 `$REQUEST_URI`(Apache 以外の Web サーバでは変わる可能性があります) で指定された送信先ファイル名を得ることができます。送信先ファイル名は、 リモートクライアントが指定したものです。このクライアントの指定を 必ずしも受ける必要はありません。例えば、アップロードされた全ての ファイルを特別なアップロード用ディレクトリにコピーすることも可能です。

前のページ | ホーム | 次のページ
複数ファイルのアップロード | 上に戻る | リモートファイルの使用