本人两天前写了一个单个图片上传的博客,现在写一个多文件上传的
先写一个添加图片的界面,比较简陋,但是这里有三种不同的方式
第一种:

<form action="doAction3.php" method="post" enctype="multipart/form-data"><input type="file" name="myFile1" /><br><input type="file" name="myFile2"/><br><input type="file" name="myFile3"/><br><input type="submit" value="上传"/></form>

第二种:

<form action="doAction3.php" method="post" enctype="multipart/form-data"><input type="file" name="myFile[]" /><br><input type="file" name="myFile[]"/><br><input type="file" name="myFile[]"/><br><input type="submit" value="上传"/></form>

第三种

<form action="doAction3.php" method="post" enctype="multipart/form-data"><input type="file" name="myFile[]" multiple="multiple" /><br><input type="submit" value="上传"/></form>

第一种说白了就是多个单文件上传,再次不再多加描述,不懂的可以去看我上一集写的博客
单文件上传

主要说第二种和第三种
第二种,是点击一次,选择一个文件,图中只有三行input代码,所以只能一次性上传3张图片
第三种,是点击一次,可以选择多张图片,选择完成,点击提交之前会显示选择了几个文件

第二种和第三种,点击上传之后我们在后端接受到的都是一个一样的三维数组,如图所示,我们先打印出来看看这个三维数组

[myFile] => Array([name] => Array([0] => 上海建桥学院 Shanghai Jian Qiao University.jpg[1] => 54c5b4120001f20808000902.jpg[2] => 52e3677900013d6a05020261.jpg)[type] => Array([0] => image/jpeg[1] => image/jpeg[2] => image/jpeg)[tmp_name] => Array([0] => C:\wamp\tmp\php4945.tmp[1] => C:\wamp\tmp\php4B78.tmp[2] => C:\wamp\tmp\php4BE6.tmp)[error] => Array([0] => 0[1] => 0[2] => 0)[size] => Array([0] => 876196[1] => 159952[2] => 28190))

我们可以看到,这是把单个文件中的各个属性归了类,重新组成了一个数组,因此我们要把这个数组转换多个单文件数组:

function buildInfo(){//     $info = $_FILES;$i = 0;foreach ($_FILES as $v){//三维数组转换成2维数组if(is_string($v['name'])){ //单文件上传$info[$i] = $v;$i++;}else{ // 多文件上传foreach ($v['name'] as $key=>$val){//2维数组转换成1维数组//取出一维数组的值,然后形成另一个数组//新的数组的结构为:info=>i=>('name','size'.....)$info[$i]['name'] = $v['name'][$key];$info[$i]['size'] = $v['size'][$key];$info[$i]['type'] = $v['type'][$key];$info[$i]['tmp_name'] = $v['tmp_name'][$key];$info[$i]['error'] = $v['error'][$key];$i++;}}}return $info;
}

通过以上封装的buildInfo方法,我们可以把传过来的三维数组转换为多个单文件数组,我们打印出来看一下:

array0 => array'name' => string '上海建桥学院 Shanghai Jian Qiao University.jpg' (length=52)'size' => int 876196'type' => string 'image/jpeg' (length=10)'tmp_name' => string 'C:\wamp\tmp\phpC8A5.tmp' (length=23)'error' => int 01 => array'name' => string '54c5b4120001f20808000902.jpg' (length=28)'size' => int 159952'type' => string 'image/jpeg' (length=10)'tmp_name' => string 'C:\wamp\tmp\phpCAA9.tmp' (length=23)'error' => int 02 => array'name' => string '52e3677900013d6a05020261.jpg' (length=28)'size' => int 28190'type' => string 'image/jpeg' (length=10)'tmp_name' => string 'C:\wamp\tmp\phpCB08.tmp' (length=23)'error' => int 0

如图所示,我们已经得到了多个单文件(图片)组成的新数组,接下来我们来上传:

function uploadfile($path="uploads",$allowExt = array('png','jpg','jpeg','gif','mmp','qnmlgb'),$maxSize=1048576,$imgFlag=true){if (! file_exists($path)) {mkdir($path,0777,true);}$i = 0;$infoArr = buildInfo();foreach ($infoArr as $val) {if ($val['error'] === UPLOAD_ERR_OK) {$ext = getExt($val['name']);for($j=0;$j<count($allowExt);$j++){if($ext == $allowExt[$j]){$m = "此文件适合上传标准";$h = $m;}else {$m = "此文件不可以被上传";}}if($h){$mes = "文件格式正确";}else{$mes = "文件格式错误";exit;}if($val['size']>$maxSize){$mes = "文件太大了";exit;}if($imgFlag){$result = getimagesize($val['tmp_name']);if(!$result){$mes = "您上传的不是一个真正图片";exit;}}if(!is_uploaded_file($val['tmp_name'])){$mes = "不是通过httppost传输的";exit;}$realName = getUniName().".".$ext;$destination = $path."/".$realName;if(move_uploaded_file($val['tmp_name'], $destination)){$val['name'] = $realName;unset($val['error'],$val['tmp_name'],$val['size'],$val['type']);$uploadedFiles[$i]=$val;//?????????$i++;}}else {switch ($val['error']) {case 1: // UPLOAD_ERR_INI_SIZE$mes = "超过配置文件中上传文件的大小";break;case 2: // UPLOAD_ERR_FORM_SIZE$mes = "超过表单中配置文件的大小";break;case 3: // UPLOAD_ERR_PARTIAL$mes = "文件被部分上传";break;case 4: // UPLOAD_ERR_NO_FILE$mes = "没有文件被上传";break;case 6: // UPLOAD_ERR_NO_TMP_DIR$mes = "没有找到临事文件目录";break;case 7: // UPLOAD_ERR_CANT_WRITE$mes = "文件不可写";break;case 8: // UPLOAD_ERR_EXTENSION$mes = "php扩展程序中断了上传程序";break;}echo $mes;}}return $uploadedFiles;
}

在封装函数的时候我们把这几个默认变量赋值了:

$path="uploads", //文件存放路径
$allowExt = array('png','jpg','jpeg','gif','mmp','qnmlgb')//可被存放的文件后缀名,注mmp,qnmlgb是我瞎写的后缀名
$maxSize=1048576,//设置文件上传的大小,1048576为1m
$imgFlag=true//判断是否真为一张图片,可为true,也可为false

接来下就是各种判断:

if (! file_exists($path)) {mkdir($path,0777,true);}

这是用来判断路径是否存在,要是不存在则创建

$i = 0;
$infoArr = buildInfo();

我们设置一个$infoArr来接受上面已经转化好的多个单文件数组,接下来就是用foreach循环来上传图片,并返回一个包含所有上传图片名称的数组,我们一步步来看

 foreach ($infoArr as $val) {if ($val['error'] === UPLOAD_ERR_OK) {}else {switch ($val['error']) {case 1: // UPLOAD_ERR_INI_SIZE$mes = "超过配置文件中上传文件的大小";break;case 2: // UPLOAD_ERR_FORM_SIZE$mes = "超过表单中配置文件的大小";break;case 3: // UPLOAD_ERR_PARTIAL$mes = "文件被部分上传";break;case 4: // UPLOAD_ERR_NO_FILE$mes = "没有文件被上传";break;case 6: // UPLOAD_ERR_NO_TMP_DIR$mes = "没有找到临事文件目录";break;case 7: // UPLOAD_ERR_CANT_WRITE$mes = "文件不可写";break;case 8: // UPLOAD_ERR_EXTENSION$mes = "php扩展程序中断了上传程序";break;}echo $mes;}

我们可以看出这是用来判断error类型的,只有当error的值为UPLOAD_ERR_OK时才可以进行下一步判断

 $ext = getExt($val['name']);for($j=0;$j<count($allowExt);$j++){if($ext == $allowExt[$j]){$m = "此文件适合上传标准";$h = $m;}else {$m = "此文件不可以被上传";}}if($h){$mes = "文件格式正确";}else{$mes = "文件格式错误";exit;}

这是用来判断文件后缀名的方法,当数组中name的值得后缀名在我们规定的范围内时,我们才允许进行下一步,否则直接退出。
代码中的getExt($val[‘name’])
getExt()这是我们之前定义的方法,作用是截取文件名的后缀名代码如下

/*** 得到文件的扩展名* @param unknown $fileName* @return string*/
function getExt($fileName){return strtolower(end(explode('.',$fileName)));/*** strtolower() 函数把字符串转换为小写。* end()输出数组中最后一个元素的值* explode(),拆分字符串*/
}

接下来继续判断

if($imgFlag){$result = getimagesize($val['tmp_name']);if(!$result){$mes = "您上传的不是一个真正图片";exit;}}

getimagesize这是用来判断是否真的是一张图片的方法,不是则会返回false

if($val['size']>$maxSize){$mes = "文件太大了";exit;}

判断文件是否超过预设大小,之前我们设置的是1m

 if(!is_uploaded_file($val['tmp_name'])){$mes = "不是通过httppost传输的";exit;}

判断文件是不是通过http post方式提交的

  $realName = getUniName().".".$ext;$destination = $path."/".$realName;if(move_uploaded_file($val['tmp_name'], $destination)){$val['name'] = $realName;unset($val['error'],$val['tmp_name'],$val['size'],$val['type']);$uploadedFiles[$i]=$val;//?????????$i++;}

我们通过move_uploaded_file()方法将图片传递到相应文件夹中,
且将文件夹中的文件名传到 $uploadedFiles数组中
运行一下,发现页面上输出了包含三个文件的文件名的数组,且文件夹中出现了三个文件,至此上传成功

php多图片(文件)上传相关推荐

  1. .Net Core 图片文件上传下载

    当下.Net Core项目可是如雨后春笋一般发展起来,作为.Net大军中的一员,我热忱地拥抱了.Net Core并且积极使用其进行业务的开发,我们先介绍下.Net Core项目下实现文件上传下载接口. ...

  2. Office文档上传后实时转换为PDF格式_图片文件上传后实时裁剪_实现在线预览Office文档

    Office文档上传后实时转换为PDF格式_图片文件上传后实时裁剪 前置条件 安装LibreOffice 安装OpenOffice 安装Unoconv 安装ImageMagick.x86_64 安装G ...

  3. springmvc图片文件上传接口

    springmvc图片文件上传 用MultipartFile文件方式传输 Controller package com.controller;import java.awt.image.Buffere ...

  4. axios文件上传 formdata_基于业务场景下的图片/文件上传方案总结

    图片/文件上传组是企业项目开发中必不可少的环节之一, 但凡涉及到用户模块的都会有图片/文件上传需求, 在很多第三方组件库(ant desigin, element ui)中它也是基础组件之一. 接下来 ...

  5. php是视频还是图片格式,php 视频、音频和图片文件上传,该如何解决

    PHP code<?php ob_start(); $uploadDir = dirname(__FILE__).'/upload'; //自动创建目录 if(!file_exists($upl ...

  6. Java实现图片文件上传

    Java实现图片文件上传 Java实现后台图片上传,将上传图片的接口进行分层,便于维护接口. 接口部分(interface) 将接口分为单图片上传以及多图片上传 public interface Fi ...

  7. php中图片文件上传,显示缩略图

    php中图片文件上传,显示缩略图 htm代码块: <meta charset="utf-8" /> <style>img {max-width: 100px ...

  8. php 上传本地图片到服务器上,PHP如何将图片文件上传到另外一台服务器上

    说,我有一个需求,就是一个临时功能.由于工作开发问题,我们有一个B项目,需要有一个商品添加的功能,涉及到添加商品内容,比如商品名字,商品描述,商品库存,商品图片等.后台商品添加的接口已经写完了,但是问 ...

  9. android webview 多文件上传,Android网页WebView图片文件上传的问题

    Android网页WebView图片文件上传的问题 发布时间:2020-07-13 22:48:15 来源:51CTO 阅读:5922 作者:拾荒者老大 在安卓下,webview上传图片点击是没用的, ...

  10. 原生态的ajax如何上传文件,原生ajax和iframe框架实现图片文件上传的两种方式

    大家应该可以举出几种常用的异步文件上传功能的实现方式,使用频率较多的有原生ajax和iframe框架,实现图片文件上传,下面就为大家分享图片文件上传的两种方式:原生ajax和iframe框架,供大家参 ...

最新文章

  1. 前端测试 karma mocha should 都是什么鬼?
  2. 吉大c 语言程序设计奥鹏作业,吉大19秋学期《C语言程序设计》在线作业一【满分答案】...
  3. Host is not allowed to connect to this MySQL server解决方法
  4. jQuery实现父窗口的问题
  5. python判断奇数_python 中x%2 x1 判断偶数奇数 性能对比
  6. Android RecyclerView、ListView实现单选列表的优雅之路.
  7. python十大必备知识_学Python必备的基础知识
  8. 神码与SUSE共促Unix向x86+Linux迁移
  9. 【OCP|052】OCP题库更新,052最新考题及答案整理-第10题
  10. mybatis中resultMap的几种用法
  11. 阿里的Atlas组件化框架
  12. asp毕业设计——基于asp+access的学生论坛设计与实现(毕业论文+程序源码)——学生论坛
  13. mysql:Prepared statement needs to be re-prepared
  14. python lambda拉姆达表达式
  15. 智能电视有网但是服务器超时,智能电视越用越卡怎么办?四招教你解决电视卡顿...
  16. (以三星S8为例)安卓全面屏手势设置教程
  17. Inspiron光驱改装固态硬盘_Win10系统安装
  18. 服务器简介(一):服务器定义、服务器特点、服务器分类、服务器软件
  19. 最新百度地图—POI搜索功能讲解
  20. 李大勇matlab密码,基于MatlabSimulink的太阳能热水系统仿真研究 沈超.doc

热门文章

  1. 一键防御CC攻击,防御CC攻击,DDOS攻击完美解决,0误封,防御方案详解
  2. 消费类电子产品相关接口技术的发展
  3. 计算机考研877难不难,計算機方向考研全都是統考嗎?為什麼有的學校專業課是877,有的是850呢?不全都是408嗎?...
  4. PIC16F877A与Proteus仿真-I2C
  5. LocalService
  6. java 实现电子签名_java swing实现手写板电子签名系统 | 学步园
  7. 公司注册地和经营地不一致有什么影响?
  8. Java设计模式-中介模式/中介模式具体怎么使用,使用场景又是什么
  9. 联影医疗通过注册:拟募资125亿 薛敏控制32%股权
  10. 临床预测模型评鉴(PMID: 33303841)