在胡说之前,首先声明,本文是建立在掌握php单文件上传的基础上,所以这里就不赘述文件上传服务器配置,表单设置该注意的地方了。

   话不多少,直入主题,在请求页面方面有两种写法(只呈现表单部分,以上传三个文件为例。)

    

<form action="doAction.php" method="post" enctype="multipart/form-data">
请选择我的上传文件
<input type="file" name="myfile[]"/>
<input type="file" name="myfile[]" />
<input type="file" name="myfile[]" />
<input type="submit" value="上传" />
</form>
<form action="doAction.php" method="post" enctype="multipart/form-data">
请选择我的上传文件
<input type="file" name="myfil1"/>
<input type="file" name="myfil2"/>
<input type="file" name="myfil3"/>
<input type="submit" value="上传" />
</form>

  两个对比,发现仅仅是name的不同,第一个将name设置成数组的形式,而第二个则是我们通常设置也很容易想到的一种方法。

  虽然表面上显示的仅仅有一点点不同,但真正提交到doAction.php页面的$_FILES则有很大不同。

  第一种的$_FILES是一个三维数组,而第二种是二维数组,如下:

  

    

  

显然我们处理第二种格式的$_FILES更加方便。当然我们也可以想办法将第一种格式的$_FILES转化为第二种形式,如下:\

function getFiles(){

    foreach($_FILES as $file){
$fileNum=count($file['name']);
if ($fileNum==1) { $files=$file;
}else{ for ($i=0; $i < $fileNum; $i++) {
$files[$i]['name']=$file['name'][$i];
$files[$i]['type']=$file['type'][$i];
$files[$i]['tmp_name']=$file['tmp_name'][$i];
$files[$i]['error']=$file['error'][$i];
$files[$i]['size']=$file['size'][$i];
}
} }
return $files;
}

通过这个函数,将$_FILES转化为下面格式:

  

  此刻,两种上传方式已经处在同一起跑线了,下面的工作便是编写uploadFile()函数对每个文件进行上传,这也是本文的重点。

  文件上传函数:

function uploadFile($file,$path='./uploads',$max_size,$allowExt){
  $filename=$file['name'];
$type=$file['type'];
$temp_name=$file['tmp_name'];
$error=$file['error'];
$size=$file['size']; if ($error==UPLOAD_ERR_OK) {
if ($size>$max_size) {
$res['mes']=$filename."文件超过规定上传大小";
}
$ext=getExt($filename);
if (!in_array($ext, $allowExt)) {
$res['mes']=$filename.'文件名不合乎规范';
}
if (!is_uploaded_file($temp_name)) {
$res['mes']=$filename."文件不是通过HTTP POST 方法上传上传过来的";
} if (@$res) {
return $res;
} if (!file_exists($path)) {
mkdir($path,0777,true);
      chmod($path, 0777);
}
$fname=getUniName(); $destination=$path.'/'.$fname.'.'.$ext;
if (move_uploaded_file($temp_name, $destination)) {
$res['mes']=$filename.'上传成功';
$res['dest']=$destination;
}else{
$res['mes']=$filename."文件上传失败";
}
}else{
switch ($error) {
case '1':
$res['mes']="超过了配置文件上传文件的大小";
break;
case '2':
$res['mes']="超过表单设置上传文件文件的大小";
break;
case '3':
$res['mes']="文件部分被上传";
break;
case '4':
$res['mes']="没有文件被上传"; break;
case '6':
$res['mes']="没有找到临时目录";
break;
case '7':
$res['mes']="文件不可写"; break;
default:
$res['mes']="上传文件失败";
break;
}
} return $res; }

其中还涉及了两个小函数:

/**
* 获得文件扩展名
* @param string $filename 上传文件名
* @return string 返回扩展名
*/
function getExt($filename){
$arr=explode('.', basename($filename)); return end($arr);
}
/**
* 获得文件唯一扩展名
* @return string 经过md5后生成32位唯一的上传文件名
*/
function getUniName(){ return md5(uniqid(microtime(true),true));
}

感受:

  很久前接触过php文件上传,当时感觉一团乱麻。现在看来只要掌握$_FILES里面包含什么信息,利用自己写过的知识处理一些小技巧,系统有逻辑的加以考虑,适时地封装函数,以后文件上传就可以很快地展开。这次我展现的代码必然不是能满足任何需要,所以可以适当改造,成为自己的代码。比如如果要求上传文件是图片内容的话,单靠扩展名是绝对不能判断的,还需要利用图片的特性加以验证。

  

php文件上传之多文件上传的更多相关文章

  1. 强大的支持多文件上传的jQuery文件上传插件Uploadify

    支持多文件上传的jQuery文件上传插件Uploadify,目前此插件有两种版本即Flash版本和HTML5版本,对于HTML5版本会比较好的支持手机浏览器,避免苹果手机Safari浏览器不支持Fla ...

  2. spring mvc文件上传(单个文件上传|多个文件上传)

    单个文件上传spring mvc 实现文件上传需要引入两个必须的jar包    1.所需jar包:                commons-fileupload-1.3.1.jar       ...

  3. php实现文件上传与下载(上)

    php实现文件的上传与下载是一个挺基本的功能,一般网站多多少少都会有这样的需求在内,当然不是说所有的文件都可以被上传,那这网络就太没有安全性可言了.因为接触php时间不长,今天写练练手,随笔也就是公开 ...

  4. SecureCRT上传和下载文件

    SecureCRT上传和下载文件(下载默认目录) SecureCR 下的文件传输协议有ASCII .Xmodem .Ymodem .Zmodem ASCII:这是最快的传输协议,但只能传送文本文件. ...

  5. thinkphp如何一次性的上传多个文件,在文件域中可以多选?

    可以做到类似于某度网盘的样式吗? 文件夹的命名, 可以用单数, 也可以用复数, 在同一个项目中, 只要统一就好了. 毕竟项目开发不同于英语写作. 建议使用缩写, 不管是不是缩写都用单数, 这样简洁,容 ...

  6. Drupal8重命名上传的中文名文件

    完整的模块代码文件在Coding.net上,想直接使用的请前往下载:https://coding.net/u/yamus/p/chinese_rename/git/tree/master 最近吧Dru ...

  7. WordPress上传含有中文文件出现乱码

    最近打算学习安装配置WordPress,当然同时也在学习PHP+MySQL,希望以后能做一些关于WordPress定制和二次开发,包括主题和插件.在成功安装WordPress3.5中文版之后,就测试了 ...

  8. SpringMVC 实现POI读取Excle文件中数据导入数据库(上传)、导出数据库中数据到Excle文件中(下载)

    读取Excale表返回一个集合: package com.shiliu.game.utils; import java.io.File; import java.io.FileInputStream; ...

  9. 11、只允许在主目录下上传和下载文件,不允许用putty登录

    创建用户xiao,   使其只允许在用户主目录 (/var/www/html)下上传和下载文件,不允许用putty登录 (为了安全起见,不给过多的权限) 1.创建xiao用户 [root@localh ...

  10. springMvc 使用ajax上传文件,返回获取的文件数据 附Struts2文件上传

    总结一下 springMvc使用ajax文件上传 首先说明一下,以下代码所解决的问题 :前端通过input file 标签获取文件,通过ajax与后端交互,后端获取文件,读取excel文件内容,返回e ...

随机推荐

  1. Servlet生命周期+工作原理

    Servlet生命周期+工作原理 1.Servlet的生命周期:     Servlet加载,加载,服务,销毁. 2.典型函数解释:     Init():这个函数是用来初始化Servlet对象的.在 ...

  2. Json常用的转换

    简单记录一下jquery里面的JSON.parse()和JSON.stringify()函数,和js中的eval()函数的用法 1,JSON.parse 函数(常用) 作用:将 JavaScript ...

  3. 一个自定义 HBase Filter -“通过RowKeys来高性能获取数据”

    摘要: 大家在使用HBase和Solr搭建系统中经常遇到的一个问题就是:“我通过SOLR得到了RowKeys后,该怎样去HBase上取数据”.使用现有的Filter性能差劲,网上也没有现成的自定义Fi ...

  4. Hadoop could not find or load main class

    Error: Could not find or load main class <class_name> 我在尝试使用hadoop definitive guide的代码做练习时,遇到一 ...

  5. Java语言中的基本词汇

    1.标识符包.类.方法.参数和变量的名称.大小写字母.数字._和$符号的组合,不以数字开始,不能使关键字,不能包括分隔符和换行.(严格区分大小写,最大长度255个字符) 2.字面量  某种类型的值(具 ...

  6. NOIP2008普及组传球游戏(动态规划)——yhx

    题目描述 上体育课的时候,小蛮的老师经常带着同学们一起做游戏.这次,老师带着同学们一起做传球游戏. 游戏规则是这样的:n个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹哨子时开始传球,每个同 ...

  7. js制作倒计时效果

    该程序可以计算任意指定的两个日期中间的差值. 本例子的指定日期是2017年1月1日,当前时间是2016年10月21日:计算它们之间的差值,在网页上显示如图所示: 关键部分代码: var nowtime ...

  8. Android多线程----异步消息处理机制之Handler详解

    ​[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...

  9. 测试杂感:Bug Bash

    缺陷大扫除(Bug Bash)是一项短期的全员测试活动.在微软,许多开发团队会在里程碑(milestone)的末期执行缺陷大扫除.程序员.测试员.程序经理.内部用户.市场人员在1~3天的时间窗口中,运 ...

  10. PCTF-2016-WEB

    Pctf ** web100 PORT51**  开始看到这个真的无法下手,想过用python–socket编程或者scapy发包.自己觉得是可以的,但是没有去试,后面看一大神writeup,知道: ...