<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/features.file-upload.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'zh',
  ),
  'this' => 
  array (
    0 => 'features.file-upload.put-method.php',
    1 => '对 PUT 方法的支持',
    2 => '对 PUT 方法的支持',
  ),
  'up' => 
  array (
    0 => 'features.file-upload.php',
    1 => '文件上传处理',
  ),
  'prev' => 
  array (
    0 => 'features.file-upload.multiple.php',
    1 => '上传多个文件',
  ),
  'next' => 
  array (
    0 => 'features.file-upload.errors.seealso.php',
    1 => '参见',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'zh',
    'path' => 'features/file-upload.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="features.file-upload.put-method" class="sect1">
  <h2 class="title">对 PUT 方法的支持</h2>
  <p class="para">
   PHP 对部分客户端具备的
   HTTP PUT 方法提供了支持。PUT 请求比文件上传要简单的多，它们一般的形式为：
   <div class="informalexample">
    <div class="example-contents">
<div class="HTTPcode"><pre class="HTTPcode">PUT /path/filename.html HTTP/1.1</pre>
</div>
    </div>

   </div>
  </p>
  <p class="para">
   这通常意味着远程客户端会将其中的 <var class="filename">/path/filename.html</var>
   存储到 web 目录树。让 Apache 或者 PHP 自动允许所有人覆盖
   web 目录树下的任何文件显然是很不明智的。因此，要处理类似的请求，必须先告诉
   web 服务器需要用特定的 PHP 脚本来处理该请求。在 Apache 下，可以用
   <em>Script</em> 选项来设置。它可以被放置到
   Apache 配置文件中几乎所有的位置。通常我们把它放置在
   <code class="literal">&lt;Directory&gt;</code> 区域或者 <code class="literal">&lt;VirtualHost&gt;</code> 区域。可以用如下一行来完成该设置：
   <div class="informalexample">
    <div class="example-contents">
<div class="cdata"><pre>
Script PUT /put.php
</pre></div>
    </div>

   </div>
  </p>
  <p class="simpara">
   这将告诉 Apache 将所有对 URI 的 PUT 请求全部发送到  <var class="filename">put.php</var> 脚本，这些
   URI 必须和 PUT 命令中的内容相匹配。当然，这是建立在 PHP 支持
   <var class="filename">.php</var> 扩展名，并且 PHP 已经在运行的假设之上。此脚本的所有
   PUT 请求的目标资源必须是脚本本身，而不是上传文件本身的文件名。
  </p>
  <p class="simpara">
   使用 PHP，可以在 put.php 中执行类似下面的操作。这会将上传文件的内容复制到服务器上的文件
   <var class="filename">myputfile.ext</var>。在执行此文件复制之前，可能会希望执行一些检查并且验证用户身份。
  </p>
  <p class="para">
   <div class="example" id="example-1">
    <p><strong>示例 #1 保存 HTTP PUT 文件</strong></p>
    <div class="example-contents">
     <div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #FF8000">/* PUT 数据来自于 stdin 流 */<br /></span><span style="color: #0000BB">$putdata </span><span style="color: #007700">= </span><span style="color: #0000BB">fopen</span><span style="color: #007700">(</span><span style="color: #DD0000">"php://input"</span><span style="color: #007700">, </span><span style="color: #DD0000">"r"</span><span style="color: #007700">);<br /><br /></span><span style="color: #FF8000">/* 打开要写入的文件 */<br /></span><span style="color: #0000BB">$fp </span><span style="color: #007700">= </span><span style="color: #0000BB">fopen</span><span style="color: #007700">(</span><span style="color: #DD0000">"myputfile.ext"</span><span style="color: #007700">, </span><span style="color: #DD0000">"w"</span><span style="color: #007700">);<br /><br /></span><span style="color: #FF8000">/* 每次读取 1KB 的数据并写入到文件 */<br /></span><span style="color: #007700">while (</span><span style="color: #0000BB">$data </span><span style="color: #007700">= </span><span style="color: #0000BB">fread</span><span style="color: #007700">(</span><span style="color: #0000BB">$putdata</span><span style="color: #007700">, </span><span style="color: #0000BB">1024</span><span style="color: #007700">))<br />  </span><span style="color: #0000BB">fwrite</span><span style="color: #007700">(</span><span style="color: #0000BB">$fp</span><span style="color: #007700">, </span><span style="color: #0000BB">$data</span><span style="color: #007700">);<br /><br /></span><span style="color: #FF8000">/* 关闭流 */<br /></span><span style="color: #0000BB">fclose</span><span style="color: #007700">(</span><span style="color: #0000BB">$fp</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">fclose</span><span style="color: #007700">(</span><span style="color: #0000BB">$putdata</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </div>
  </p>
 </div><?php manual_footer($setup); ?>