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
AMFPHP php远程调用(RPC, Remote Procedure Call)工具 快速入门教程
May 10 PHP
php下将多个数组合并成一个数组的方法与实例代码
Feb 03 PHP
PHP 中关于ord($str)&amp;gt;0x80的详细说明
Sep 23 PHP
PHP在不同页面间传递Json数据示例代码
Jun 08 PHP
php function用法如何递归及return和echo区别
Mar 07 PHP
在WordPress中实现评论头像的自定义默认和延迟加载
Nov 24 PHP
PHP的邮件群发系统phplist配置方法详细总结
Mar 30 PHP
PHP策略模式定义与用法示例
Jul 27 PHP
PHP面向对象程序设计之构造方法和析构方法详解
Jun 13 PHP
php如何获取Http请求
Apr 30 PHP
php实现自动生成验证码的实例讲解
Nov 17 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
解析thinkphp基本配置 convention.php
2013/06/18 PHP
php实现转换html格式为文本格式的方法
2016/05/16 PHP
Yii框架的布局文件实例分析
2019/09/04 PHP
php解析非标准json、非规范json的方式实例
2020/12/10 PHP
javascript html 静态页面传参数
2009/04/10 Javascript
javascript删除option选项的多种方法总结
2013/11/22 Javascript
分享JavaScript获取网页关闭与取消关闭的事件
2013/12/13 Javascript
JavaScript中输出标签的方法
2014/08/27 Javascript
innerHTML属性,outerHTML属性,textContent属性,innerText属性区别详解
2015/03/13 Javascript
JS截取与分割字符串常用技巧总结
2015/11/10 Javascript
jQuery如何使用自动触发事件trigger
2015/11/29 Javascript
javascript实现起伏的水波背景效果
2016/05/16 Javascript
AngularJs Javascript MVC 框架
2016/06/20 Javascript
微信小程序 生命周期详解
2016/10/12 Javascript
vue-router跳转时打开新页面的两种方法
2019/07/29 Javascript
node创建Vue项目步骤详解
2020/03/06 Javascript
Python实现动态添加类的属性或成员函数的解决方法
2014/07/16 Python
python time模块用法实例详解
2014/09/11 Python
Python中实现常量(Const)功能
2015/01/28 Python
利用Python中的输入和输出功能进行读取和写入的教程
2015/04/14 Python
Python实现对比不同字体中的同一字符的显示效果
2015/04/23 Python
Python的Tornado框架实现图片上传及图片大小修改功能
2016/06/30 Python
Python类的动态修改的实例方法
2017/03/24 Python
Tensorflow环境搭建的方法步骤
2018/02/07 Python
Python多进程fork()函数详解
2019/02/22 Python
分析经典Python开发工程师面试题
2019/04/08 Python
利用Python实现kNN算法的代码
2019/08/16 Python
详解Python 重学requests发起请求的基本方式
2020/02/07 Python
HTML5拖拽功能实现的拼图游戏
2018/07/31 HTML / CSS
Nike挪威官网:Nike.com (NO)
2018/11/26 全球购物
汽车检测与维修专业求职信
2013/10/30 职场文书
四年级学生评语大全
2014/04/21 职场文书
《明天,我们毕业》教学反思
2014/04/24 职场文书
小学教师学习党的群众路线教育实践活动心得体会
2014/10/31 职场文书
SpringBoot整合RabbitMQ的5种模式实战
2021/08/02 Java/Android
Python 正则模块详情
2021/11/02 Python