PHP作为一种广泛使用的服务端脚本语言,提供了处理文件上传的内置支持。本教程将详细介绍使用PHP进行文件上传的不同方面,包括POST方法上传、错误信息说明、常见的缺陷、如何上传多个文件,以及对HTTP PUT方法的支持。
一、POST方法上传
参见《PHP POST上传文件》。
二、错误信息说明
参见《PHP错误信息说明》。
三、常见缺陷
对于 PHP 中的文件上传限制,需要注意几个方面:
1、确保 MAX_FILE_SIZE 的值不大于 php.ini 文件中 upload_max_filesize 选项设置的值,否则上传文件时会出现错误。
2、如果启用了内存限制,也要确保 memory_limit 设置的足够大,以便处理大型文件。
3、还要注意 max_execution_time 的设置,确保值足够大,以允许脚本在上传和处理文件时能够完整运行。
注意:
- max_execution_time 仅仅影响脚本本身运行的时间,而不包括任何其他花费在脚本运行之外的时间,例如系统调用、sleep() 函数的使用、数据库查询、文件上传等。因此,在计算脚本运行的最大时间时,这些时间都不应该被包括在内;
- max_input_time 指定脚本接收输入(包括文件上传)的最长时间(以秒为单位)。默认值为 60 秒,如果文件较大或有多个文件,或者用户的网络连接速度较慢,则可能会超过默认值。
如果 post_max_size 设置得过小,较大的文件将无法上传。因此,请确保 post_max_size 的值足够大。
max_file_uploads 配置设置可控制一次请求可上传的最大文件数。如果上传的文件超过上限,那么 $_FILES 将在达到上限时停止处理文件。例如,如果 max_file_uploads 设置为 10,那么 $_FILES 将永远不会包含超过 10 个项目。
- 如果不验证正在处理的文件,这可能意味着用户可以访问其他目录中的敏感信息。
- 由于文件路径的表示方法不同,因此无法保证正确处理外文文件名(尤其是包含空格的文件名)。
- 开发人员不应在同一表单变量中混合使用普通输入字段和文件上传字段(例如,两个输入名称都使用 foo[])。
四、上传多个文件
可以对 input 域使用不同的 name 来上传多个文件。
PHP 支持同时上传多个文件并将它们的信息自动以数组的形式组织。要完成这项功能,需要在 HTML 表单中对文件上传域使用和多选框与复选框相同的数组式提交语法。
示例:
<form action="file-upload.php" method="post" enctype="multipart/form-data"> Send these files:<br /> <input name="userfile[]" type="file" /><br /> <input name="userfile[]" type="file" /><br /> <input type="submit" value="Send files" /> </form>
当以上表单被提交后,数组 $_FILES[‘userfile’],$_FILES[‘userfile’][‘name’] 和 $_FILES[‘userfile’][‘size’] 将被初始化。
例如,假设名为 /home/test/review.html 和 /home/test/xwp.out 的文件被提交,则 $_FILES[‘userfile’][‘name’][0] 的值将是 review.html,而 $_FILES[‘userfile’][‘name’][1] 的值将是 xwp.out。类似的,$_FILES[‘userfile’][‘size’][0] 将包含文件 review.html 的大小,依此类推。
此外也同时设置了 $_FILES[‘userfile’][‘name’][0], $_FILES[‘userfile’][‘tmp_name’][0], $_FILES[‘userfile’][‘size’][0] 以及 $_FILES[‘userfile’][‘type’][0]。
五、对PUT方法支持
PHP 对部分客户端具备的 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 时,您可以在 put.php 中执行如下操作。这将把上传文件的内容复制到服务器上的 myputfile.ext 文件中。在执行文件复制之前,您可能需要执行一些检查和/或验证用户身份。