自己整理的一些 PHP 处理文件上传要点

一、php.ini 配置


1. file_uploads

控制是否允许客户端以 http 方式上传文件,默认值为 On ,如果要禁用 http 上传功能,修改此配置项为 Off 即可。

2. upload_tmp_dir

指定上传的文件在被正式处理以前的临时保存目录,默认值为 NULL

3. upload_max_filesize

控制允许文件上传的最大值,如果用户上传的文件大于此值,PHP 则会创建一个大小为0的占位符文件。这个配置项再 PHP 中默认值为 2M,即系统默认允许上传的最大文件大小为 2M.

4. post_max_size

控制 PHP 允许用户通过 POST 方式传递给服务器的最大数据(不止文件)大小,该值必须大于 upload_max_filesize ,因为它是所有 POST 数据的大小,自然包括了任何上传的文件大小,系统默认最大允许的 POST 数据大小为 8M.

二、表单


1. <form> 标签中,必须设置属性 enctype="multipart/form-data", 这样服务器才能识别上传文件的表单;

2. 表单内部,可以设置一个说明本次上传的最大文件大小的隐藏域,例如:

<input name="MAX_FILE_SIZE" type="hidden" value="1000000"></input>

表示本次上传的文件最大为 1000000 Bytes(约1MB).

3. 表单内部也可以指定一个 PHP 用来操作上传后文件的标识符,例如:

<input name="userfile" type="file"></input>

文件上传以后 PHP 将使用 "userfile" 这个标识符作为访问临时文件的索引。

三、PHP 全局变量: $_FILES


客户端表单上传文件完成以后,该文件将会被保存在 php.ini 中 upload_tmp_dir 指定的临时目录中(如果没有配置,则会保存在服务器的主临时目录中),如果再脚本执行完成之前,没有移动、复制或更改名称,临时文件将会被删除。

PHP 将需要处理的文件句柄保存在超全局变量 $_FILES 多维数组中,通过之前再上传表单中指定的临时文件操作标识符(示例中的 "userfile"),可以获取上传以后文件的相关信息,主要的信息有:

$_FILES['userfile']['tmp_name'] —— 临时文件在服务器中的存储路径

$_FILES['userfile']['name'] —— 临时文件在文件系统中的文件名

$_FILES['userfile']['size'] —— 上传的文件大小

$_FILES['userfile']['type'] —— 上传的文件 MIME 类型,例如:text/plain 或者 image/gif

$_FILES['userfile']['error'] —— 用于保存上传后的系统错误提示码

四、错误码


1. UPLOAD_ERROR_OK,值为 0,标示上传成功

2. UPLOAD_ERR_INI_SIZE,值为 1,表示上传文件的大小超出了配置项 upload_max_filesize 的值;

3. UPLOAD_ERR_FORM_SIZE,值为 2,表示上传文件的大小超出了用户再 html 表单中指定的 MAX_FILE_SIZE 的值;

4. UPLOAD_ERR_PARTIAL,值为3,表示文件上传不完整,服务器只成功接收到部分文件;

5. UPLOAD_ERR_NO_FILE,值为4,表示没有上传任何文件;

6. UPLOAD_NO_TMP_DIR,值为6,这一错误码是 PHP5.1 之后的版本中引入的,表示没有在 php.ini 中指定 upload_tmp_dir 配置项的值;

7. UPLOAD_ERR_CANT_WRITE,值为7,这一错误码是 PHP5.0.3 之后的版本中引入的,表示将文件写入到磁盘中的时候发生了错误,很有可能是 PHP 没有执行写操作的权限导致的。

五、PHP 处理上传后临时文件


1. is_uploaded_file($file):检测文件是否是通 HTTP POST 方式上传的;

2. move_uploaded_file($file, $newpath):将上传后的临时文件移动到指定的路径中,防止脚本结束后系统删除临时文件。