PHP 多个文件上传
关键函数:
is_uploaded_file():用于判断指定的文件是否是通过 HTTP POST 上传的,如果是则返回 TRUE。用于防止潜在的攻击者对原本不能通过脚本交互的文件进行非法管理,这可以用来确保恶意的用户无法欺骗脚本去访问本不能访问的文件。
move_uploaded_file():文件上传后,首先会存储在服务器的临时目录中,可以是该函数将上传的文件移动到新位置。与 copy() 和 move() 相比,该函数还有一种额外的功能,检查并确保由第一个参数 filename 指定的文件,是否是合法的上传文件( 即通过 PHP 的 HTTP POST 上传机制所上传的 )。如果文件合法,则将其移动为由第二个参数 destination 指定的文件。如果 filename 不是合法的上传文件,不会出现任何操作,将返回 FALSE。如果 filename 是合法的上传文件,但出于某些原因无法移动,不会出现任何操作,也将返回FALSE。此外还将发出一条警告。若成功则返回TRUE。
其他函数:
array_pop():弹出并返回数组中的最后一个元素,并将 array 的长度减1。案例中用于取出文件后缀。
list():用数组中的元素为一组变量赋值。
多个文件上传只需要在单个文件上传的基础上,在原来的二维数组 $_FILES 之外进行一次循环。
HTML:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>文件上传</title> </head> <body> <form action="upload.php" method="post" enctype="multipart/form-data"> <input type="hidden" name="MAX_FILE_SIZE" value="1000000"> 选择文件1:<input type="file" name="myfile[]"><br> 选择文件2:<input type="file" name="myfile[]"><br> 选择文件3:<input type="file" name="myfile[]"><br> <input type="submit" value="上传文件"> </form> </body> </html>
图1
图2
uoload.php:
<?php $allowtype = array("gif","png","jpg"); //允许上传的文件格式 $size = 1000000; //设置允许大小1M以内的文件 $path = "./uploads"; //设置上传后保存文件的路径 //判断文件是否可以上传到服务器 $_FILES['myfile'][error]为0表示成功 //循环 for( $i = 0;$i < count($_FILES['myfile']['error']);$i++ ){ $upfile[$i] = $_FILES['myfile']['name'][$i]; if($_FILES['myfile']['error'][$i]>0){ echo "上传错误"; switch($_FILES['myfile']['error'][$i]){ case 1: die('第'.($i+1).'个文件上传文件大小超出了PHP配置文件中的约定值:upload_max_filesize'); case 2: die('上传第'.($i+1).'个文件大小超出了表单中的约定值:MAX_FILE_SIZE'); case 3: die('第'.($i+1).'个文件只被部分上传'); case 4: die('第'.($i+1).'个文件没有上传'); default: die('未知错误'); } } //判断上传的文件是否为允许的文件类型,通过文件的后缀名 //array_pop 弹出并返回数组中的最后一个元素,并将array的长度减1 $hz[$i] = array_pop(explode(".",$_FILES['myfile']['name'][$i])); if(!in_array($hz[$i],$allowtype)){ die("第".($i+1)."个文件后缀是<b>{$hz}</b>,不是允许的文件类型!"); } /*也可通过获取上传文件的MIME类型中的主类型和子类型,来限制文件上传的类型 list($maintype,$subtype) = explode("/",$_FILES['myfile']['type']); if($maintype == "text"){ die("不能上传文本文件"); } */ //判断上传的文件是否允许大小 if($_FILES['myfile']['size'][$i]>$size){ die("第".($i+1)."个文件超过了允许的<b>{$size}</b>"); } //为了系统安全,同时也为了同名文件不被覆盖,上传后将文件名使用系统定义 $filename[$i] = date("YmdHis").rand(100,999).".".$hz[$i]; //判断是否为上传文件 if(is_uploaded_file($_FILES['myfile']['tmp_name'][$i])){ if(!move_uploaded_file($_FILES['myfile']['tmp_name'][$i],$path.'/'.$filename[$i])){ die("不能将文件移动到指定目录"); } }else{ die("上传文件{$_FILES['myfile']['name'][$i]}不是一个合法文件"); } //如果文件上传成功 $filesize[$i] = $_FILES['myfile']['size'][$i]/1024; echo "文件{$upfile[$i]}上传成功,保存在目录{$path}中,文件大小为{$filesize[$i]}KB<br>"; }
页面显示:
文件87d11a09d24848fa3ac763fe.jpg上传成功,保存在目录./uploads中,文件大小为34.60546875KB
文件0ef5e0fef0adab0f5c6008a2.jpg上传成功,保存在目录./uploads中,文件大小为37.810546875KB
文件2dbda88c96801dd6f11f3617.jpg上传成功,保存在目录./uploads中,文件大小为168.0478515625KB
相关文章
- PHP上传文件
- Windows下图文详解PHP三种运行方式(php_mod、cgi、fastcgi)
- PHP判断文件或者目录是否可写
- 谈谈PHP中require和include的区别
- php如何防止SQL注入
- 织梦dedecms后台文件media_add.php任意上传漏洞解决办法
- PHP Socket编程 之 php中连接tcp服务的三种方式
- php面试题之PHP核心技术
- 以源码编译的方式安装PHP与php-fpm
- php/nginx/axios: 文件上传: 配置最长执行时间等相关项 (php8.1.1 / nginx 1.18.0 / vue@3.2.26 )
- PHP文件操作[总结]
- php:在linux上用sudo提升权限(centos 8 / PHP 7.4.2)
- PHP正则获取图片信息
- [转]通过设置nginx的client_max_body_size解决nginx+php上传大文件的问题
- Atitit 文件上传 架构设计 实现机制 解决方案 实践java php c#.net js javascript c++ python
- Atitit 文件上传 架构设计 实现机制 解决方案 实践java php c#.net js javascript c++ python
- atitit.提取zip rar文件列表 java php c# 的原理与设计
- atitit. 文件上传带进度条 atiUP 设计 java c# php
- PHP面试题:php读取文件内容的几种方法和函数?
- PHP面试题:写一个二维数组排序算法函数,能够具有通用性,可以调用php内置函数(array_multisort())
- PHP上传文件超过了最大文件大小限制导致无法上传成功