关键函数:

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 多个文件上传的更多相关文章

  1. jquery.uploadify文件上传组件

    1.jquery.uploadify简介 在ASP.NET中上传的控件有很多,比如.NET自带的FileUpload,以及SWFUpload,Uploadify等等,尤其后面两个控件的用户体验比较好, ...

  2. 11、Struts2 的文件上传和下载

    文件上传 表单准备 要想使用 HTML 表单上传一个或多个文件 须把 HTML 表单的 enctype 属性设置为 multipart/form-data 须把 HTML 表单的method 属性设置 ...

  3. Java FtpClient 实现文件上传服务

    一.Ubuntu 安装 Vsftpd 服务 1.安装 sudo apt-get install vsftpd 2.添加用户(uftp) sudo useradd -d /home/uftp -s /b ...

  4. 小兔Java教程 - 三分钟学会Java文件上传

    今天群里正好有人问起了Java文件上传的事情,本来这是Java里面的知识点,而我目前最主要的精力还是放在了JS的部分.不过反正也不麻烦,我就专门开一贴来聊聊Java文件上传的基本实现方法吧. 话不多说 ...

  5. ,net core mvc 文件上传

    工作用到文件上传的功能,在这个分享下 ~~ Controller: public class PictureController : Controller { private IHostingEnvi ...

  6. Web开发安全之文件上传安全

    很长一段时间像我这种菜鸡搞一个网站第一时间反应就是找上传,找上传.借此机会把文件上传的安全问题总结一下. 首先看一下DVWA给出的Impossible级别的完整代码: <?php if( iss ...

  7. AutoIt实现Webdriver自动化测试文件上传

    在运用WebDriver进行自动化测试时,由于WebDriver自身的限制,对于上传文件时Windows弹出的文件选择窗口无法控制,通过在网上查找资料锁定使用AutoIt来控制文件上传窗口. Auto ...

  8. Struts的文件上传下载

    Struts的文件上传下载 1.文件上传 Struts2的文件上传也是使用fileUpload的组件,这个组默认是集合在框架里面的.且是使用拦截器:<interceptor name=" ...

  9. .JavaWeb文件上传和FileUpload组件使用

    .JavaWeb文件上传 1.自定义上传 文件上传时的表单设计要符合文件提交的方式: 1.提交方式:post 2.表单中有文件上传的表单项:<input type="file" ...

  10. ASP.NET MVC5+EF6+EasyUI 后台管理系统(32)-swfupload多文件上传[附源码]

    系列目录 文件上传这东西说到底有时候很痛,原来的asp.net服务器控件提供了很简单的上传,但是有回传,还没有进度条提示.这次我们演示利用swfupload多文件上传,项目上文件上传是比不可少的,大家 ...

随机推荐

  1. C++ STL算法系列4---unique , unique_copy函数

     一.unique函数 类属性算法unique的作用是从输入序列中“删除”所有相邻的重复元素. 该算法删除相邻的重复元素,然后重新排列输入范围内的元素,并且返回一个迭代器(容器的长度没变,只是元素顺序 ...

  2. [转]使用VC/MFC创建一个线程池

    许多应用程序创建的线程花费了大量时间在睡眠状态来等待事件的发生.还有一些线程进入睡眠状态后定期被唤醒以轮询工作方式来改变或者更新状态信息.线程池可以让你更有效地使用线程,它为你的应用程序提供一个由系统 ...

  3. Zabbix利用msmtp+mutt发送邮件报警(公告:这文章有问题,还没有修改,2016-08-25)

    [root@86 ~]# wget http://jaist.dl.sourceforge.net/project/msmtp/msmtp/1.4.32/msmtp-1.4.32.tar.bz2 百度 ...

  4. [转]ThreadPoolExecutor线程池的分析和使用

    1. 引言 合理利用线程池能够带来三个好处. 第一:降低资源消耗.通过重复利用已创建的线程降低线程创建和销毁造成的消耗. 第二:提高响应速度.当任务到达时,任务可以不需要等到线程创建就能立即执行. 第 ...

  5. [杂] ASP.NET MVC 之 Route To MvcHandler

    首先,本文参考了不少东东,仅供Q_L_H自己使用,ZZ自己负责.先上一张全家福: HttpModules and HttpHandlers ASP.NET MVC 是 HttpHandler. Url ...

  6. CI框架分页类代码

    model层  ;     $page = $);     ;      }else{         $start = $page;       }     $data['results'] = $ ...

  7. SharedPreferences存储

    *通过getSharedPreferences()方法获得SharedPreferences对象 SharedPreferences pref = getShaedPreferences(“key”, ...

  8. SU Demos-04Deconvolution-02Wiener_Levinson

    本Demo共有4个脚本,我只看了第一个,后面的3个不熟悉,就不往这里贴图了,望谅解. 不足之处,欢迎批评指正. 先看readme 生成数据所需的c程序 make上述c程序时需要的makefile(本人 ...

  9. Xamarin iOS编写第一个应用程序创建工程

    Xamarin iOS编写第一个应用程序创建工程 在Xcode以及Xamarin安装好后,就可以在Xamarin Studio中编写程序了.本节将主要讲解在Xamarin Studio中如何进行工程的 ...

  10. 安卓智能手持POS打印票据 扫描盘点移动开单软件/无线开单系统/PDA移动开单软件

    移动开单手持机,它通过WIFI或者GPRS连接并访问电脑数据,实现移动扫描开单,数据同步上传等功能.方便.实用,大大提高工作效率!安卓智能手持POS是一套适合大酒店.咖啡馆..洗衣店.按摩洗浴,商场等 ...