自己整理的一些 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)
:将上传后的临时文件移动到指定的路径中,防止脚本结束后系统删除临时文件。