對 PUT 方法的支援

PHP 3 和 PHP 4 對 PUT 方法的支援有所不同。在 PHP 4 中,必須使用標準的輸入流來讀取一個 HTTP PUT 的內容。

例子 38-5. 用 PHP 4 來儲存 HTTP PUT 檔案

<?php
/* PUT data comes in on the stdin stream */
$putdata fopen("php://stdin""r");

/* Open a file for writing */
$fp fopen("myputfile.ext""w");

/* Read the data 1 KB at a time
   and write to the file */
while ($data fread($putdata1024))
  
fwrite($fp$data);

/* Close the streams */
fclose($fp);
fclose($putdata);
?>

注: 以下文件的內容僅對 PHP 3 適用。

PHP 提供對諸如 Netscape Composer 和 W3C Amaya 等用戶端使用的 HTTP PUT 方法的支援。PUT 請求比檔案上傳要簡單的多,它們一般的形式為:

PUT /path/filename.html HTTP/1.1

這通常意味著遠端用戶端會將其中的 /path/filename.html 存儲到 web 目錄樹。讓 Apache 或是 PHP 自動容許所有人覆蓋 web 目錄樹下的任何檔案顯然是很不明智的。因此,要處理類似的請求,必須先告訴 web 伺服器需要用特定的 PHP 腳本來處理該請求。在 Apache 下,可以用 Script 選項來設定。它可以被放置到 Apache 配置檔中幾乎所有的位置。通常我們把它放置在 <Directory> 區功能變數或是 <Virtualhost> 區功能變數。可以用如下一行來完成該設定:

Script PUT /put.php

這將告訴 Apache 將所有對 URI 的 PUT 請求全部傳送到 put.php 腳本,這些 URI 必須和 PUT 指令中的內容相符合。當然,這是建立在 PHP 支援 .php 副檔名,並且 PHP 已經在運行的假設之上。

在 put.php 檔案中,可以作如下動作:

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

這將會把檔案複製到遠端用戶端請求的位置。可能希望在檔案複製之前進行一些檢查或是對會員認證之類的動作。這裡唯一的問題是,當 PHP 接受到 PUT 方法的請求時,它將會把上傳的檔案儲存到和其它用 POST 方法處理過的檔案相同的臨時目錄。在請求結束時,暫存檔案將被移除。因此,用來處理 PUT 的 PHP 腳本必須將該檔案複製到其它的地方。該暫存檔案的檔案名被儲存在變量 $PHP_PUT_FILENAME 中,也可以通過 $REQUEST_URI 變量獲得建議的目的檔案名(在非 Apache web 伺服器上可能會有較大的變化)。該目的檔案名是由遠端用戶端特殊的。也可以不聽從改用戶端的訊息,而把所有上傳的檔案存儲到一個特殊的上傳目錄下。