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和ACCESS写聊天室(十)
Oct 09 PHP
PHP Smarty生成EXCEL文档的代码
Aug 23 PHP
用sql命令修改数据表中的一个字段为非空(not null)的语句
Jun 04 PHP
php中强制下载文件的代码(解决了IE下中文文件名乱码问题)
May 09 PHP
win2003服务器使用WPS的COM组件的一些问题解决方法
Jan 11 PHP
linux下编译安装memcached服务
Aug 03 PHP
php中获取主机名、协议及IP地址的方法
Nov 18 PHP
php将数组转换成csv格式文件输出的方法
Mar 14 PHP
PHP整合七牛实现上传文件
Jul 03 PHP
PHP中SQL查询语句的id=%d解释(推荐)
Dec 10 PHP
PHP仿qq空间或朋友圈发布动态、评论动态、回复评论、删除动态或评论的功能(上)
May 26 PHP
使用ucenter实现多站点同步登录的讲解
Mar 21 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邮件发送类PHPMailer用法实例详解
2014/09/22 PHP
php实现给一张图片加上水印效果
2016/01/02 PHP
PHP中$GLOBALS与global的区别详解
2019/03/21 PHP
动态加载图片路径 保持JavaScript控件的相对独立性
2010/09/06 Javascript
html5的自定义data-*属性和jquery的data()方法的使用示例
2013/08/21 Javascript
Javascript中arguments和arguments.callee的区别浅析
2015/04/24 Javascript
基于jQuery实现点击列表加载更多效果
2016/05/31 Javascript
d3.js入门教程之数据绑定详解
2017/04/28 Javascript
JavaScript闭包_动力节点Java学院整理
2017/06/27 Javascript
vue.js学习之UI组件开发教程
2017/07/03 Javascript
jQuery实现手机号正则验证输入及自动填充空格功能
2018/01/02 jQuery
Nuxt项目支持eslint+pritter+typescript的实现
2019/05/20 Javascript
Node.js API详解之 console模块用法详解
2020/05/12 Javascript
[54:29]2018DOTA2亚洲邀请赛 4.7 淘汰赛 VP vs LGD 第二场
2018/04/09 DOTA
python网络编程示例(客户端与服务端)
2014/04/24 Python
python僵尸进程产生的原因
2017/07/21 Python
python 遍历目录(包括子目录)下所有文件的实例
2018/07/11 Python
python pandas实现excel转为html格式的方法
2018/10/23 Python
Python中调用其他程序的方式详解
2019/08/06 Python
django商品分类及商品数据建模实例详解
2020/01/03 Python
将数据集制作成VOC数据集格式的实例
2020/02/17 Python
Python 字符串处理特殊空格\xc2\xa0\t\n Non-breaking space
2020/02/23 Python
Python基础进阶之海量表情包多线程爬虫功能的实现
2020/12/17 Python
红色康乃馨酒店:Red Carnation Hotels
2017/06/22 全球购物
GOOD AMERICAN官网:为曲线性感而设计
2017/12/28 全球购物
Melissa鞋马来西亚官方网站:MDreams马来西亚
2018/04/05 全球购物
文明礼貌演讲稿
2014/05/12 职场文书
社区领导班子四风问题原因分析及整改措施
2014/09/28 职场文书
贷款工作证明模板
2015/06/12 职场文书
创业计划书之甜品店
2019/09/18 职场文书
python中pandas.read_csv()函数的深入讲解
2021/03/29 Python
python制作图形界面的2048游戏, 基于tkinter
2021/04/06 Python
python中的None与NULL用法说明
2021/05/25 Python
tensorflow中的数据类型dtype用法说明
2021/05/26 Python
Java实现给Word文件添加文字水印
2022/02/15 Java/Android
SpringBoot深入分析讲解监听器模式下
2022/07/15 Java/Android