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 cache类代码(php数据缓存类)
Apr 15 PHP
php Ubb代码编辑器函数代码
Jul 05 PHP
Linux+Nginx+MySQL下配置论坛程序Discuz的基本教程
Dec 23 PHP
Windows2003下php5.4安装配置教程(Apache2.4)
Jun 30 PHP
PHP通过微信跳转的Code参数获取用户的openid(关键代码)
Jul 06 PHP
简单的pgsql pdo php操作类实现代码
Aug 25 PHP
php封装的单文件(图片)上传类完整实例
Oct 18 PHP
php通过会话控制实现身份验证实例
Oct 18 PHP
php-beanstalkd消息队列类实例分享
Jul 19 PHP
关于php支持的协议与封装协议总结(推荐)
Nov 17 PHP
PHP PDOStatement::getAttribute讲解
Feb 01 PHP
PHP程序员必须知道的两种日志实例分析
May 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
Mac系统下使用brew搭建PHP(LNMP/LAMP)开发环境
2015/03/03 PHP
如何使用jQuery+PHP+MySQL来实现一个在线测试项目
2015/04/26 PHP
浅谈PDO的rowCount函数
2015/06/18 PHP
实例详解PHP中html word 互转的方法
2016/01/28 PHP
phalcon框架使用指南
2016/02/23 PHP
PHP 计算两个时间段之间交集的天数示例
2019/10/24 PHP
让div层随鼠标移动的实现代码 ie ff
2009/12/18 Javascript
js使用eval解析json(js中使用json)
2014/01/17 Javascript
angularJS中router的使用指南
2015/02/09 Javascript
JavaScript实现的一个倒计时的类
2015/03/12 Javascript
jQuery插件Flexslider实现图片轮播、图文结合滑动切换效果
2020/04/16 Javascript
JS转换HTML转义符的方法
2016/08/24 Javascript
vue自定义tap指令及tap事件的实现
2018/09/18 Javascript
JS无限级导航菜单实现方法
2019/01/05 Javascript
使用微信SDK自定义分享的方法
2019/07/03 Javascript
详解vue页面首次加载缓慢原因及解决方案
2019/11/06 Javascript
jQuery实现全选、反选和不选功能的方法详解
2019/12/04 jQuery
vue中提示$index is not defined错误的解决方式
2020/09/02 Javascript
python通过字典dict判断指定键值是否存在的方法
2015/03/21 Python
Python实现屏幕截图的两种方式
2018/02/05 Python
高效使用Python字典的清单
2018/04/04 Python
用PyInstaller把Python代码打包成单个独立的exe可执行文件
2018/05/26 Python
和孩子一起学习python之变量命名规则
2018/05/27 Python
关于pytorch中网络loss传播和参数更新的理解
2019/08/20 Python
Python colormap库的安装和使用详情
2020/10/06 Python
Python之字符串的遍历的4种方式
2020/12/08 Python
CSS3 translate导致字体模糊的实例代码
2019/08/30 HTML / CSS
MSC邮轮官方网站:加勒比海、地中海和世界各地的假期
2018/08/27 全球购物
公司合作意向书范文
2014/07/30 职场文书
一份教室追逐打闹的检讨书
2014/09/27 职场文书
公安个人四风问题对照检查及整改措施
2014/10/28 职场文书
停电放假通知
2015/04/14 职场文书
2015年社区流动人口工作总结
2015/05/12 职场文书
2016年领导干部正风肃纪心得体会
2015/10/09 职场文书
青年文明号创建口号大全
2015/12/25 职场文书
Mysql超详细讲解死锁问题的理解
2022/04/01 MySQL