PHP上传文件详解
1.上传文件使用的提交方式和请求Content-type
POST提交方式,原始的form表单提交请加上enctype="multipart/form-data"
2.MAX_FILE_SIZE 隐藏字段(单位为字节)
必须放在文件输入字段之前,其值为接收文件的最大尺寸。这是对浏览器的一个建议,PHP 也会检查此项。在浏览器端可以简单绕过此设置,因此不要指望用此特性来阻挡大文件。实际上,PHP 设置中的上传文件最大值是不会失效的。但是最好还是在表单中加上此项目,因为它可以避免用户在花时间等待上传大文件之后才发现文件过大上传失败的麻烦
3.关于上传文件的相关配置有哪些?
file_uploads = On/Off #是否允许文件上传
upload_max_filesize = 20M #上传文件的大小限制
max_file_uploads = 20 #每个请求上传文件的数量限制
max_input_time = 60 #脚本解析输入数据允许的最大时间,单位是秒。 它从接收所有数据到开始执行脚本进行测量的
post_max_size = 16M #最大POST数据大小
upload_tmp_dir =/tmp #上传文件的临时目录
4.PHP从$_FILES数组中获取上传文件信息
$_FILES['userfile']['name'] #客户端机器文件的原名称
$_FILES['userfile']['type'] #文件的 MIME 类型,一个例子是“image/gif”。不过此 MIME 类型在 PHP 端并不检查,因此不要想当然认为有这个值
$_FILES['userfile']['size'] #已上传文件的大小,单位为字节
$_FILES['userfile']['tmp_name'] #文件被上传后在服务端储存的临时文件名
$_FILES['userfile']['error'] #和该文件上传相关的错误代码。此项目是在 PHP 4.2.0 版本中增加的
注:如果该文件没有被移动到其它地方也没有被改名,则该文件将在表单请求结束时被删除。
5.单文件上传实例
前端 <form enctype="multipart/form-data" action="__URL__" method="POST"> <!-- MAX_FILE_SIZE must precede the file input field --> <input type="hidden" name="MAX_FILE_SIZE" value="30000" /> <!-- Name of input element determines name in $_FILES array --> Send this file: <input name="userfile" type="file" /> <input type="submit" value="Send File" /> </form> 后端 <?php // In PHP versions earlier than 4.1.0, $HTTP_POST_FILES should be used instead // of $_FILES. $uploaddir = '/var/www/uploads/'; $uploadfile = $uploaddir . basename($_FILES['userfile']['name']); echo '<pre>'; if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) { echo "File is valid, and was successfully uploaded.\n"; } else { echo "Possible file upload attack!\n"; } echo 'Here is some more debugging info:'; print_r($_FILES); print "</pre>";
6.多文件上传
前端 <form action="" method="post" enctype="multipart/form-data"> <p>Pictures: <input type="file" name="pictures[]" /> <input type="file" name="pictures[]" /> <input type="file" name="pictures[]" /> <input type="submit" value="Send" /> </p> </form> 后端 <?php foreach ($_FILES["pictures"]["error"] as $key => $error) { if ($error == UPLOAD_ERR_OK) { $tmp_name = $_FILES["pictures"]["tmp_name"][$key]; $name = $_FILES["pictures"]["name"][$key]; move_uploaded_file($tmp_name, "data/$name"); } }
7.is_uploaded_file — 判断文件是否是通过 HTTP POST 上传的
这可以用来确保恶意的用户无法欺骗脚本去访问本不能访问的文件,例如 /etc/passwd。
<?php if (is_uploaded_file($_FILES['userfile']['tmp_name'])) { echo "File ". $_FILES['userfile']['name'] ." uploaded successfully.\n"; echo "Displaying contents\n"; readfile($_FILES['userfile']['tmp_name']); } else { echo "Possible file upload attack: "; echo "filename '". $_FILES['userfile']['tmp_name'] . "'."; }