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的中问验证码
Nov 25 PHP
解决php中Cannot send session cache limiter 的问题的方法
Apr 27 PHP
php获取文件大小的方法
Feb 26 PHP
ThinkPHP学习笔记(一)ThinkPHP部署
Jun 22 PHP
php实现无限级分类
Dec 24 PHP
4种PHP异步执行的常用方式
Dec 24 PHP
Yii2.0 Basic代码中路由链接被转义的处理方法
Sep 21 PHP
thinkphp分页集成实例
Jul 24 PHP
基于php数组中的索引数组和关联数组详解
Mar 12 PHP
ThinkPHP3.2框架自定义配置和加载用法示例
Jun 14 PHP
用PHP做了一个领取优惠券活动的示例代码
Jul 05 PHP
Laravel框架查询构造器 CURD操作示例
Sep 04 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
PHP4 与 MySQL 数据库操作函数详解
2006/10/09 PHP
多文件上传的例子
2006/10/09 PHP
一个用于mysql的数据库抽象层函数库
2006/10/09 PHP
ASP.NET jQuery 实例13 原创jQuery文本框字符限制插件-TextArea Counter
2012/02/03 Javascript
用Javascript来生成ftp脚本的小例子
2013/07/03 Javascript
js保留小数点后几位的写法
2014/01/03 Javascript
js 实现的可折叠留言板(附源码下载)
2014/07/01 Javascript
多个checkbox被选中时如何判断是否有自己想要的
2014/09/22 Javascript
javascript常用的方法分享
2015/07/01 Javascript
EditPlus 正则表达式 实战(3)
2016/12/15 Javascript
angular实现form验证实例代码
2017/01/17 Javascript
canvas雪花效果核心代码分享
2017/02/19 Javascript
js中Number数字数值运算后值不对的解决方法
2017/02/28 Javascript
React Native 集成jpush-react-native的示例代码
2017/08/16 Javascript
React Navigation 使用中遇到的问题小结
2018/05/08 Javascript
jQuery 导航自动跟随滚动的实现代码
2018/05/30 jQuery
axios简单实现小程序延时loading指示
2018/07/30 Javascript
Javascript格式化并高亮xml字符串的方法及注意事项
2018/08/13 Javascript
使用JavaScript实现贪吃蛇游戏
2020/09/29 Javascript
[01:27]DOTA2电竞之夜 今夜共饮庆功酒
2014/08/02 DOTA
用python记录运行pid,并在需要时kill掉它们的实例
2017/01/16 Python
python虚拟环境virtualenv的使用教程
2017/10/20 Python
Python 3.8中实现functools.cached_property功能
2019/05/29 Python
python中的itertools的使用详解
2020/01/13 Python
Tensorflow中的dropout的使用方法
2020/03/13 Python
解决使用python print打印函数返回值多一个None的问题
2020/04/09 Python
Python性能分析工具py-spy原理用法解析
2020/07/27 Python
如何利用Python matplotlib绘制雷达图
2020/12/21 Python
CSS3的first-child选择器实战攻略
2016/04/28 HTML / CSS
初中女生自我鉴定
2013/12/19 职场文书
企业金融服务方案
2014/06/03 职场文书
淘宝客服工作职责
2014/07/11 职场文书
奖学金感谢信
2015/01/21 职场文书
客房部经理岗位职责
2015/02/02 职场文书
Python Pandas模块实现数据的统计分析的方法
2021/06/24 Python
一次SQL查询优化原理分析(900W+数据从17s到300ms)
2022/06/10 SQL Server