php文件上传的两种实现方法


Posted in PHP onApril 04, 2016

文件上传一般有下面2种方式:

有两种:
1、标准input表单方式,典型的用$_FILES进行接收;
2、以Base64的方式进行传送,一般是AJAX异步上传。

第一种
标准的input表单方式,适用于大文件进行上传,同时支持批量。html代码关键的几句:

<form enctype="multipart/form-data" method="post" action="upload.php"">
  <input type="file" name="id_pic[]" accept="image/*" class="form-control" multiple />
  <input type="submit" value="上传 " />
</form>

不同的name时:

<form enctype="multipart/form-data" method="post" action="upload.php"">
  <input type="file" name="id_pic_1" accept="image/*" class="form-control" />
  <input type="file" name="id_pic_2" accept="image/*" class="form-control" />
  <input type="submit" value="上传 " />
</form>

其中enctype="multipart/form-data"对于文件上传是必不可少的。另外type="file"设置input类型,accept="image/*"指定优先上传图片(MIME 参考手册)。multiple支持一次选多个文件,pic[]以数组的形式接收多个文件。手机端端还可以加入参数capture="camera"选择摄像头拍照上传。

后端处理:
通过$_FILES获取上传的文件。

$files = $_FILES;
传多个文件时,如果name不同,则返回的$_FILES数组格式不同。

name相同时:

array(1) {
 ["id_pic"] => array(5) {
  ["name"] => array(2) {
   [0] => string(5) "1.jpg"
   [1] => string(5) "2.jpg"
  }
  ["type"] => array(2) {
   [0] => string(10) "image/jpeg"
   [1] => string(10) "image/jpeg"
  }
  ["tmp_name"] => array(2) {
   [0] => string(27) "C:\Windows\Temp\php7A7E.tmp"
   [1] => string(27) "C:\Windows\Temp\php7A7F.tmp"
  }
  ["error"] => array(2) {
   [0] => int(0)
   [1] => int(0)
  }
  ["size"] => array(2) {
   [0] => int(77357)
   [1] => int(56720)
  }
 }
}

name不相同时:

array(2) {
 ["id_pic_1"] => array(5) {
  ["name"] => string(5) "1.jpg"
  ["type"] => string(10) "image/jpeg"
  ["tmp_name"] => string(27) "C:\Windows\Temp\phpBBEE.tmp"
  ["error"] => int(0)
  ["size"] => int(77357)
 }
 ["id_pic_2"] => array(5) {
  ["name"] => string(5) "2.jpg"
  ["type"] => string(10) "image/jpeg"
  ["tmp_name"] => string(27) "C:\Windows\Temp\phpBBEF.tmp"
  ["error"] => int(0)
  ["size"] => int(56720)
 }
}

在对$_FILES进行foreach遍历时,前面那种输出格式不大方便。后面那种就可以直接遍历。我们可以写个方法进行统一转换:

function dealFiles($files) {
    $fileArray = array();
    $n     = 0;
    foreach ($files as $key=>$file){
      if(is_array($file['name'])) {
        $keys    =  array_keys($file);
        $count   =  count($file['name']);
        for ($i=0; $i<$count; $i++) {
          $fileArray[$n]['key'] = $key;
          foreach ($keys as $_key){
            $fileArray[$n][$_key] = $file[$_key][$i];
          }
          $n++;
        }
      }else{
        $fileArray = $files;
        break;
      }
    }
    return $fileArray;
 }

好,前面讲到后端如何处理接收到的$_FILES数组,并转换成统一格式。接下来任务主要是:
1、检测上传的文件是否非法;
2、检测上传的文件是否超过大小;
3、检测保存的路径是否存在,是否可写;
4、文件重命名;

其中上传过程中用到了个很重要的函数:move_uploaded_file(filename , $destination )进行文件移动操作。将$_FILES['id_pic']['tmp_name']移动到新的路径里。当然,移动前可以用is_uploaded_file($_FILES['id_pic']['tmp_name'])进行判断文件是否正常上传的。

多文件上传则是循环的方法多次使用move_uploaded_file()进行移动操作。

第二种
主要以上传图片为主。
利用input的change事件,借助canvas对图片进行处理(例如压缩),然后ajax发送文件流到后端。

基本原理是通过canvas渲染图片,再通过 toDataURL 方法压缩保存为base64字符串(能够编译为jpg格式的图片)。

后端处理:
后端最终会收到前端发送的base64字符串,接着处理字符串为图片即可。具体请使用关键字base64 转 image 开发语言进行谷歌|百度。前端生成的结果中有一个base64Len,这是字符串的长度,后端应该核对以确认是否提交完整。

//php示例:
$img = base64_decode($_POST['img']);
$img = imagecreatefromstring($img);

以上就是本文的全部内容,希望对大家的学习有所帮助。

PHP 相关文章推荐
用PHP制作静态网站的模板框架(二)
Oct 09 PHP
PHP脚本的10个技巧(1)
Oct 09 PHP
php htmlspecialchars加强版
Feb 16 PHP
mysql 查询指定日期时间内sql语句实现原理与代码
Dec 16 PHP
php判断GIF图片是否为动画的方法
Sep 04 PHP
php计算两个坐标(经度,纬度)之间距离的方法
Apr 17 PHP
php利用事务处理转账问题
Apr 22 PHP
编写PHP脚本来实现WordPress中评论分页的功能
Dec 10 PHP
Smarty模板引擎缓存机制详解
May 23 PHP
详谈PHP面向对象中常用的关键字和魔术方法
Feb 04 PHP
php usort 使用用户自定义的比较函数对二维数组中的值进行排序
May 02 PHP
PHP模型Model类封装数据库操作示例
Mar 14 PHP
在Win2003(64位)中配置IIS6+PHP5.2.17+MySQL5.5的运行环境
Apr 04 #PHP
PHP版本的选择5.2.17 5.3.27 5.3.28 5.4 5.5兼容性问题分析
Apr 04 #PHP
PHP命名空间和自动加载类
Apr 03 #PHP
PHP中的Trait 特性及作用
Apr 03 #PHP
PHP错误处理函数
Apr 03 #PHP
php通过curl添加cookie伪造登陆抓取数据的方法
Apr 02 #PHP
PHP函数nl2br()与自定义函数nl2p()换行用法分析
Apr 02 #PHP
You might like
第二章 PHP入门基础之php代码写法
2011/12/30 PHP
PHP批量生成图片缩略图的方法
2015/06/18 PHP
php fread读取文件注意事项
2016/09/24 PHP
php+jQuery实现的三级导航栏下拉菜单显示效果
2017/08/10 PHP
javascript 面向对象的JavaScript类
2010/05/04 Javascript
原生js实现改变随意改变div属性style的名称和值的结果
2013/09/26 Javascript
开发插件的两个方法jquery.fn.extend与jquery.extend
2013/11/21 Javascript
js实现点击链接后延迟3秒再跳转的方法
2015/06/05 Javascript
微信小程序 表单Form实例详解(附源码)
2016/12/22 Javascript
通过sails和阿里大于实现短信验证
2017/01/04 Javascript
Angularjs验证用户输入的字符串是否为日期时间
2017/06/01 Javascript
使用 Node.js 开发资讯爬虫流程
2018/01/07 Javascript
js判断传入时间和当前时间大小实例(超简单)
2018/01/11 Javascript
Vue前端开发规范整理(推荐)
2018/04/23 Javascript
原生javascript AJAX 三级联动的实现代码
2018/05/04 Javascript
React优化子组件render的使用
2019/05/12 Javascript
ES6 Symbol数据类型的应用实例分析
2019/06/26 Javascript
vue 实现cli3.0中使用proxy进行代理转发
2019/10/30 Javascript
vue.js click点击事件获取当前元素对象的操作
2020/08/07 Javascript
Javascript Symbol原理及使用方法解析
2020/10/22 Javascript
解决ant-design-vue中menu菜单无法默认展开的问题
2020/10/31 Javascript
微信小程序开发数据缓存基础知识辨析及运用实例详解
2020/11/06 Javascript
[02:16]DOTA2英雄基础教程 干扰者
2014/01/15 DOTA
[01:02:10]DOTA2上海特级锦标赛B组小组赛#2 VG VS Fnatic第一局
2016/02/26 DOTA
Python调用C/C++动态链接库的方法详解
2014/07/22 Python
python求众数问题实例
2014/09/26 Python
python实时分析日志的一个小脚本分享
2017/05/07 Python
解决tensorflow测试模型时NotFoundError错误的问题
2018/07/27 Python
python爬虫租房信息在地图上显示的方法
2019/05/13 Python
django框架模板中定义变量(set variable in django template)的方法分析
2019/06/24 Python
html5贪吃蛇游戏使用63行代码完美实现
2013/06/25 HTML / CSS
服装创业计划书范文
2014/02/05 职场文书
初中军训感想300字
2014/03/05 职场文书
党校学习心得体会范文
2014/09/09 职场文书
检讨书范文
2019/04/16 职场文书
关于python pygame游戏进行声音添加的技巧
2021/10/24 Python