CI框架实现优化文件上传及多文件上传的方法


Posted in PHP onJanuary 04, 2017

本文实例分析了CI框架实现优化文件上传及多文件上传的方法。分享给大家供大家参考,具体如下:

最近一直在研究Codeigniter框架,开发项目写到文件上传的时候发现大部分程序员使用Codeigniter框架的文件上传类编写上传方法的时候写的都存在这代码冗余(或者说代码重复利用率低、比较消耗资源。)故而我研究出一个稍微优化一点的上传方法。并且在查找资料时发现,Codeigniter框架同时上传多个文件比较困难,所以在优化方法的同时我又研究了一下如何使用Codeigniter框架实现同时上传多个文件。下面就来和大家分享一下,感兴趣的同学可以关注一下,同时欢迎大家指正错误。

1、优化文件上传方法

Codeigniter手册里面的那种大家常用的方法在这里就不重复描述了,下面直接说如何对方法进行优化以达到降低代码冗余,提高代码重复利用率的目的。

a) 首先在 “ application/config ” 新建 " upload.php " 配置文件

在 “ application/config ” 新建 " upload.php" 配置文件,在里面写入上传的配置参数。

<?php
  defined('BASEPATH') OR exit('No direct script access allowed');
  //上传的参数配置
  $config['upload_path'] = './public/uploads/';
  $config['allowed_types'] = 'gif|png|jpg';
  $config['max_size'] = 100;
  $config['max_width'] = '1024';
  $config['max_height'] = '768';

注意:upload_path参数所代表的路径文件夹你已经在项目中创建完毕!

b) 在控制器的构造函数中加载文件上传类

<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/**
 * 控制器
 */
class Brand extends Admin_Controller
{
  public function __construct()
  {
    parent::__construct();
    $this->load->model('brand_model');
    $this->load->library('form_validation');
    //激活分析器以调试程序
    $this->output->enable_profiler(TRUE);
    //配置中上传的相关参数会自动加载
    $this->load->library('upload');
  }
}

注意:我们在第一步创建的 “ upload.php ” 文件中的上传配置信息会在这里会自动进行加载。

c) 编写上传方法执行do_upload()方法进行文件上传

public function insert()
{
  //设置验证规则
  $this->form_validation->set_rules('brand_name','名称','required');
  if($this->form_validation->run() == false){
    //未通过验证
    $data['message'] = validation_errors();
    $data['wait'] = 3;
    $data['url'] = site_url('admin/brand/add');
    $this->load->view('message.html',$data);
  }else{
    //通过验证,处理图片上传
    if ($this->upload->do_upload('logo')) { //logo为前端file控件名
      //上传成功,获取文件名
      $fileInfo = $this->upload->data();
      $data['logo'] = $fileInfo['file_name'];
      //获取表单提交数据
      $data['brand_name'] = $this->input->post('brand_name');
      $data['url'] = $this->input->post('url');
      $data['brand_desc'] = $this->input->post('brand_desc');
      $data['sort_order'] = $this->input->post('sort_order');
      $data['is_show'] = $this->input->post('is_show');
      //调用模型完成添加动作
      if($this->brand_model->add_brand($data)){
        $data['message'] = "添加成功";
        $data['wait'] = 3;
        $data['url'] = site_url('admin/brand/index');
        $this->load->view('message.html',$data);
      }else{
        $data['message'] = "添加失败";
        $data['wait'] = 3;
        $data['url'] = site_url('admin/brand/add');
        $this->load->view('message.html',$data);
      }
    }else{
      //上传失败
      $data['message'] = $this->upload->display_errors();
      $data['wait'] = 3;
      $data['url'] = site_url('admin/brand/add');
      $this->load->view('message.html',$data);
    }
  }
}

注意:上述代码有部分是我项目中的代码,大家可以忽略直接关注关键的上传代码。当你需要上传不同的文件时,你也可以在方法中进行文件上传配置,使用$this->upload->initialize()方法进行配置。

2、同时上传多文件的两种方法

① 方法一思路:对所上传的多个文件进行循环处理

/**
 * Codeigniter框架实现多文件上传
 * @author Zhihua_W
 * 方法一:对上传的文件进行循环处理
 */
public function multiple_uploads1()
{
  //载入所需文件上传类库
  $this->load->library('upload');
  //配置上传参数
  $upload_config = array(
    'upload_path' => './public/uploads/',
    'allowed_types' => 'jpg|png|gif',
    'max_size' => '500',
    'max_width' => '1024',
    'max_height' => '768',
  );
  $this->upload->initialize($upload_config);
  //循环处理上传文件
  foreach ($_FILES as $key => $value) {
    if (!empty($key['name'])) {
      if ($this->upload->do_upload($key)) {
        //上传成功
        print_r($this->upload->data());
      } else {
        //上传失败
        echo $this->upload->display_errors();
      }
    }
  }
}

② 方法二思路:直接一下将多个文件全部上传然后在对上传过的数据进行处理

/**
 * Codeigniter框架实现多文件上传
 * @author Zhihua_W
 * 方法二:直接一下将多个文件全部上传然后在对上传过的数据进行处理
 */
public function multiple_uploads2()
{
  $config['upload_path'] = './public/uploads/';
  //这里的public是相对于index.php的,也就是入口文件,这个千万不能弄错!
  //否则就会报错:"The upload path does not appear to be valid.";
  $config['allowed_types'] = 'gif|jpg|png';
  //我试着去上传其它类型的文件,这里一定要注意顺序!
  //否则报错:"A problem was encountered while attempting to move the uploaded file to the final destination."
  //这个错误一般是上传文件的文件名不能是中文名,这个很郁闷!还未解决,大家可以用其它方法,重新改一下文件名就可以解决了!
  //$config['allowed_types'] = 'zip|gz|png|gif|jpg';(正确)
  //$config['allowed_types'] = 'png|gif|jpg|zip|gz';(错误)
  $config['max_size'] = '1024';
  $config['max_width'] = '1024';
  $config['max_height'] = '768';
  $config['file_name'] = time(); //文件名不使用原始名
  $this->load->library('upload', $config);
  if (!$this->upload->do_upload()) {
    echo $this->upload->display_errors();
  } else {
    $data['upload_data'] = $this->upload->data(); //上传文件的一些信息
    $img = $data['upload_data']['file_name']; //取得文件名
    echo $img . "<br>";
    foreach ($data['upload_data'] as $item => $value) {
      echo $item . ":" . $value . "<br>";
    }
  }
}

两种方法那个比较方便?那个比较高效率?大家可以试着自行尝试一下!

希望本文所述对大家基于CodeIgniter框架的PHP程序设计有所帮助。

PHP 相关文章推荐
在服务端进行目录建立、删除,文件上传、删除的过程的php代码
Sep 10 PHP
PHP实现生成透明背景的PNG缩略图函数分享
Jul 08 PHP
php常用hash加密函数
Nov 22 PHP
Yii不依赖Model的表单生成器用法实例
Dec 04 PHP
php读取flash文件高宽帧数背景颜色的方法
Jan 06 PHP
php根据某字段对多维数组进行排序的方法
Mar 07 PHP
php获取指定(访客)IP所有信息(地址、邮政编码、国家、经纬度等)的方法
Jul 06 PHP
PHP中filter函数校验数据的方法详解
Jul 31 PHP
PHP的Yii框架的基本使用示例
Aug 21 PHP
ThinkPHP表单令牌错误的相关解决方法分析
May 20 PHP
TP(thinkPHP)框架多层控制器和多级控制器的使用示例
Jun 13 PHP
浅析PHP中的 inet_pton 网络函数
Dec 16 PHP
PHP搭建大文件切割分块上传功能示例
Jan 04 #PHP
php实现的简单中文验证码功能示例
Jan 03 #PHP
php与c 实现按行读取文件实例代码
Jan 03 #PHP
浅谈PHP安全防护之Web攻击
Jan 03 #PHP
php中遍历二维数组并以表格的形式输出的方法
Jan 03 #PHP
解析PHP之提取多维数组指定列的方法
Jan 03 #PHP
PHP实现RTX发送消息提醒的实例代码
Jan 03 #PHP
You might like
php 生成WML页面方法详解
2009/08/09 PHP
基于thinkPHP框架实现留言板的方法
2016/10/17 PHP
Aster vs KG BO3 第一场2.18
2021/03/10 DOTA
用js得到网页中所有的div的id
2020/10/19 Javascript
JavaScript调试技巧之console.log()详解
2014/03/19 Javascript
jquery操作select大全
2014/04/25 Javascript
JavaScript中定义函数的三种方法
2015/03/12 Javascript
Javascript基于AJAX回调函数传递参数实例分析
2015/12/15 Javascript
JavaScript+CSS实现的可折叠二级菜单实例
2016/02/29 Javascript
基于javascript实现文字无缝滚动效果
2016/03/22 Javascript
微信小程序中多个页面传参通信的学习与实践
2017/05/05 Javascript
微信小程序的日期选择器的实例详解
2017/09/29 Javascript
Flutter 超实用简单菜单弹出框 PopupMenuButton功能
2019/08/06 Javascript
nginx配置域名后的二级目录访问不同项目的配置操作
2020/11/06 Javascript
[01:35:53]完美世界DOTA2联赛PWL S3 Magma vs GXR 第二场 12.13
2020/12/17 DOTA
Python的Django框架中settings文件的部署建议
2015/05/30 Python
从局部变量和全局变量开始全面解析Python中变量的作用域
2016/06/16 Python
Python通过调用mysql存储过程实现更新数据功能示例
2018/04/03 Python
解决Mac安装scrapy失败的问题
2018/06/13 Python
浅析Python四种数据类型
2018/09/26 Python
使用Scrapy爬取动态数据
2018/10/21 Python
基于python全局设置id 自动化测试元素定位过程解析
2019/09/04 Python
使用Django搭建一个基金模拟交易系统教程
2019/11/18 Python
pytorch 实现张量tensor,图片,CPU,GPU,数组等的转换
2020/01/13 Python
python3 logging日志封装实例
2020/04/08 Python
互斥锁解决 Python 中多线程共享全局变量的问题(推荐)
2020/09/28 Python
Pycharm安装python库的方法
2020/11/24 Python
html5 svg 中元素点击事件添加方法
2013/01/16 HTML / CSS
方法名是否可以与构造器的名字相同
2012/06/04 面试题
介绍一下linux文件系统分配策略
2013/02/25 面试题
煤矿安全生产月活动总结
2014/07/05 职场文书
苏州园林导游词
2015/02/03 职场文书
课程设计感想范文
2015/08/11 职场文书
2016教师国培研修感言
2015/12/08 职场文书
社区服务理念口号
2015/12/25 职场文书
Java SSH 秘钥连接mysql数据库的方法
2021/06/28 Java/Android