background image

文件上传,一般分为俩种方式 FTP 和 HTTP, 对于我们的互联网应用来说: FTP 上传虽然传
输稳定, 但是易用性和安全性都是个问题. 

你总不至于在用户要上传头像的时候告诉用户

请打开 FTP 客户端,上传文件到 http://www.laruence.com/uploads/中, 并以 2dk433423l.jpg 命

名 吧?
而基于 HTTP 的上传,相对来说易用性和安全性上就比 FTP 要增强了很多. 可以应用的上
传方式有 PUT, WEBDAV, 和 RFC1867 三种, 本文将分析在 PHP 中,是如何基于 RFC1867 实
现文件上传的.

RFC1867

RCF1867 是 Form-based File Upload in HTML 标准协议, RFC1867 标准对 HTML 做出了两处
修改:
 
1 为 input 元素的 type 属性增加了一个 file 选项。
2 input 标记可以具有 accept 属性,该属性能够指定可被上传的文件类型或文件格式列表。

  
另外,本标准还定义了一种新的 mime 类型:multipart/form-data,以及当处理一个带有
enctype=”multipart/form-data” 并且/或含有<input type=”file”>的标记的表单时所应该采取的
行为。
  
举例来说,当 HTML 想让用户能够上传一个或更多的文件时,他可以这么写:
<form enctype="multipart/form-data" action="upload.php" method=post>
选择文件:
<input name="userfile" type="file">
文件描述:
<input name="description" type="text">
<input type="submit" value="上传">
</form>

这个表单, 大家一定不陌生, 而对于 PHP 来说, 它自己另外定义了一个默认表单元素
MAX_FILE_SIZE, 用户可以通过这个隐藏的表单元素来建议 PHP 最多只容许上传文件的
大小, 比如对于上面的例子, 我们希望用户上传的文件不能大于 5000(5k)字节, 那么可以如
下写:
<form enctype="multipart/form-data" action="upload.php" method=post>
<input type="hidden" value="5000" name="MAX_FILE_SIZE"> <!--文件大小-->
选择文件:
<input name="userfile" type="file">
文件描述:
<input name="description" type="text">
<input type="submit" value="上传">
</form>

姑且不说, 这个 MAX_FILE_SIZE 是多么的不可靠(所以基于浏览器的控制,都是不可靠的),