PHP对文件上传的处理方法
在php中文件上传我们由html客户端与服务器端php处理组成,中间会有一些由files全局变量对数据判断与移动操作,下面一起来看看.
$_FILES参数详解:
$_FILES["file"]["name"] – 被上传文件的名称
$_FILES["file"]["type"] – 被上传文件的类型
$_FILES["file"]["size"] – 被上传文件的大小,以字节计
$_FILES["file"]["tmp_name"] – 存储在服务器的文件的临时副本的名称
$_FILES["file"]["error"] – 由文件上传导致的错误代码
$_FILES["file"]["error"]中的["error"]值情况:
html客户端
1.客户端上传设置
文件上传的最基本方法,是使用HTML表单选择本地文件进行提交,在form表单中可以通过<input type=”file”>标记选择本地文件,如果支持文件上传操作,必须在<form>标签中将enctype和method两个属性指明相应的值,如下所示:
★enctype=”multipart/form-data”用来指定表单编码数据方式,让服务器知道,我们要传递一个文件,并带有常规的表单信息。
★method=”POST”用来指明发送数据的方法.
另外,还需要在form表单中设置一个hidden类型的input框,其中name的值为MAX_FILL_SIZE的隐藏值域,并通过设置其VALUE的值限制上传文件的大小(单位字节),但这个值不能超过PHP的配置文件中upload_max_filesize值设置的大小,文件上传表单代码如下所示:
- <html>
- <head><title>文件上传</title></head>
- <body>
- <form action='upload.php' method="post" enctype="multipart/form-data">
- <input type="hidden" name="MAX_FILE_SIZE" value="1000000">
- 选择文件<input type="file" name="上传文件">
- </form>
- </body>
- </html>
upload.php服务器端,代码如下:
- <?php
- $allowtype = array('gif','png','jpg');
- $size = 1000000;
- $path = "./uploads"; //设置上传后保存文件的路径
- //判断文件是否可以成功上传到服务器,$_FILES['myfile']['error']为0则表示上传成功
- if ($_FILES['myfile']['error']>0){
- echo '上传错误:';
- switch($_FILES['myfile']['error']){
- case 1: die('上传文件大小超出了PHP配置文件中的约定值:upload_max_filesize');break;
- case 2:die('上传文件大小超出表单中的约定值:MAX_FILE_SIZE');break;
- case 3: die('上传文件只部分被上载');break;
- case 4: die('没有上传任何文件');break;
- default:die('未知错误');
- }
- }
- //判断上传的文件是否为允许的文件类型,通过文件名的后缀名
- $hz = array_pop(explode(".",$_FILES['myfile']['name']));
- //通过判断文件的后缀方式,来确定文件是否是允许上传的文件类型
- if(!in_array($hz, $allowtype)){
- die("这个后缀是<b>($hz)</b>,不是允许的文件类型");
- }
- //判断上传的文件是否为允许大小
- if($_FILES['myfile']['size']> $size){
- die("超过了允许的<b>{$size}</b>字节大小");
- }
- //为了系统安全,也为了同名文件不会被覆盖,上传后将文件名实用系统定义
- $filename = data("YmdHis").rand(100, 900).".".$hz;
- //开源软件:phpfensi.com
- //判断是否为上传文件
- if(is_uploaded_file($_FILES['myfile']['tmp_name'])){
- if(!move_uploaded_file($_FILES['myfile']['tmp_name'], $path.'/'.$filename)){
- die('问题:不能将文件移动到指定目录。');
- }
- }else{
- die("问题:上传文件{$_FILES['myfile']['name']}不是一个合法的文件:");
- }
- //如果文件上传成功则输出
- echo "文件{$upfile}上传成功,保存在目录{$path}中,大小为{$_FILES['myfile']['size']}字节";
- ?>
如果我们要多文件上传只要简单对于html上传表单以数据形式操作,代码如下:
- <form action="" method="post" enctype="multipart/form-data">
- <input type="hidden" name="MAX_FILE_SIZE" value="">
- <input type="file" name="pic[]" /><br><br>
- <input type="file" name="pic[]" /><br><br>
- <input type="file" name="pic[]" /><br><br>
- <input type="file" name="pic[]" /><br><br>
- <input type="submit" value="upload"/>
- </form>
然后对于upload.php处理文件我们只要遍历数组pic[]就可以了.
- for($i=0;$i<count($up_info['name']);$i++){
- }
- //这样//foreach 循环处理多个文件上传
①函数is_uploaded_file()
该函数判断指定的文件是否是通过HTTP POST上传的,如果是则返回TRUE。用于防止潜在的攻击者对原本不能通过脚本交互的文件进行非法管理,这可以用来确保恶意的用户无法欺骗脚本去访问本不能访问的文件,例如/etc/passwd。此函数的原型如下所示:
bool is_uploaded_file(string) //判断指定的文件是否是通过HTTP POST上传的
为了能使此函数正常工作,唯一的参数必须指定类似于$_FILES['userfile']['tmp_name']的变量,才能判断指定的文件确实是上传文件。如果使用从客户端上传的文件名$_FILES['userfile']['name']则不能正常运作。
PHP上传文件大小限制解决方法:
第一:在php.ini里面查看如下行:
- upload_max_filesize = 8M
- post_max_size = 10M
- memory_limit = 20M
把这些值改成我所说的,看看有没有问题,另外要确认上传的 <form> 里没有类似下面的这行<input type="hidden" name="MAX_FILE_SIZE" value="500000">这样也是限制上传大小用的.
第二:如果是apache 2 需要修改
/etc/httpd/conf.d/php.conf
中的LimitRequestBody 524288将524288(=512×1024)改大,比如5M(=5×1024×1024)这样上传就不会出现如上问题,上传不响应,上传现实该页无法现实也将得到解决.