yii2.0整合阿里云oss上传单个文件的示例


Posted in PHP onSeptember 19, 2017

上一篇文章已经介绍了如何整合阿里云oss,这一篇主要介绍上传文件到阿里云oss。

主要思路:首先文件要上传到服务器,然后把服务器里边的文件传到阿里云oss,成功以后就把文件信息写入数据库,失败了就删除服务器的文件。

主要步骤:

0 介绍几个oss的概念。

accessKeyId     ==>> 可以理解为访问阿里云oss的账号

accessKeySecret ==>> 可以理解为访问阿里云oss的密码

bucket          ==>> 可以理解为文件在保存的根目录

endPoint        ==>> 把它放在空间和ossfile中间,就组成了访问文件的url路径,也是获取阿里云图片的方式。

object          ==>> 你的文件传到了阿里云oss以后,路径是什么,叫什么名字

看截图更容易理解一些:

yii2.0整合阿里云oss上传单个文件的示例

1 文件上传还是涉及mvc,这次从view开始,主要就是展示一个表单,用来提交文件。aliyunoss.php代码如下:

<?php
use yii\widgets\ActiveForm;
?>

<?php $form = ActiveForm::begin(['options' => ['enctype' => 'multipart/form-data']]) ?>

<?= $form->field($model, 'files')->fileInput() ?>

  <button>Submit</button>

<?php ActiveForm::end() ?>

2 在controller里边接收文件,并转交给model处理。UploadController的示例代码如下:

public function actionTestAliyun()
  {
    $model = new UploadForm(); // 实例化上传类
    if (Yii::$app->request->isPost) {
      $model->files = UploadedFile::getInstance($model,'files'); //使用UploadedFile的getInstance方法接收单个文件

      $model->setScenario('upload'); // 设置upload场景
      $res = $model->uploadfile(); //调用model里边的upload方法执行上传
      $err = $model->getErrors(); //获取错误信息

      echo "<pre>";
      print_r($res); //打印上传结果
      print_r($err); //打印错误信息,方便排错
      exit;

    }

    return $this->render('aliyunoss',['model'=>$model]);
  }

3 当控制器把图片转移到model文件UploadForm.php以后,就要先移动文件到服务器的上传目录,然后在移动到阿里云。代码如下:

<?php
/**
 * Created by PhpStorm.
 * Description: 阿里oss上传图片
 * Author: Weini
 * Date: 2016/11/17 0017
 * Time: 上午 11:34
 */

namespace app\models;

use Yii;
use yii\base\Exception;
use yii\base\Model;

class UploadForm extends Model
{
  public $files; //用来保存文件

  public function scenarios()
  {
    return [
      'upload' => ['files'], // 添加上传场景
    ];
  }

  public function rules(){
    return [
      [['files'],'file', 'skipOnEmpty' => false, 'extensions' => 'jpg, png, gif', 'mimeTypes'=>'image/jpeg, image/png, image/gif', 'maxSize'=>1024*1024*10, 'maxFiles'=>1, 'on'=>['upload']],
      //设置图片的验证规则
    ];
  }

  /**
   * 上传单个文件到阿里云
   * @return boolean 上传是否成功
   */
  public function uploadfile(){
    $res['error'] = 1;

    if ($this->validate()) {
      $uploadPath = dirname(dirname(__FILE__)).'/web/uploads/'; // 取得上传路径
      if (!file_exists($uploadPath)) {
        @mkdir($uploadPath, 0777, true);
      }

      $ext = $this->files->getExtension();        // 获取文件的扩展名
      $randnums = $this->getrandnums();          // 生成一个随机数,为了重命名文件
      $imageName = date("YmdHis").$randnums.'.'.$ext;   // 重命名文件
      $ossfile = 'file/'.date("Ymd").'/'.$imageName;   // 这里是保存到阿里云oss的文件名和路径。如果只有文件名,就会放到空间的根目录下。
      $filePath = $uploadPath.$imageName;         // 生成文件的绝对路径

      if ($this->files->saveAs($filePath)){        // 上传文件到服务器
        $filedata['filename'] = $imageName;       // 准备图片信息,保存到数据库
        $filedata['filePath'] = $filePath;       // 准备图片信息,保存到数据库
        $filedata['ossfile'] = $ossfile;        // 准备图片信息,保存到数据库
        $filedata['userid'] = Yii::$app->user->id;   // 准备图片信息,保存到数据库,这个字段必须要,以免其他用户恶意删除别人的图片
        $filedata['uploadtime'] = time();        // 准备图片信息,保存到数据库

        // 上边这些代码不能照搬,要根据你项目的需求进行相应的修改。反正目的就是记录上传文件的信息
        // 老板,这些代码是我搬来的,没仔细看,如果出问题了,你就扣我的奖金吧^_^

        $trans = Yii::$app->db->beginTransaction();   // 开启事务
        try{
          $savefile = Yii::$app->db->createCommand()->insert('file', $filedata)->execute(); //把文件的上传信息写入数据库
          $newid = Yii::$app->db->getLastInsertID(); //获取新增文件的id,用于返回。

          if ($savefile) {              // 如果插入数据库成功
            $ossupload = Yii::$app->Aliyunoss->upload($ossfile, $filePath); //调用Aliyunoss组件里边的upload方法把文件上传到阿里云oss

            if ($ossupload) {            // 如果上传成功,
              $res['error'] = 0;         // 准备返回信息
              $res['fileid'] = $newid;      // 准备返回信息
              $res['ossfile'] = $ossfile;     // 准备返回信息
              $trans->commit();          // 提交事务
            } else {                // 如果上传失败
              unlink($filePath);         // 删除服务器上的文件
              $trans->rollBack();         // 事务回滚
            }
          }
          unlink($filePath);             // 插入数据库失败,删除服务器上的文件
          $trans->rollBack();             // 事务回滚
        } catch(Exception $e) {             // 出了异常
          unlink($filePath);             // 删除服务器上的文件
          $trans->rollBack();             // 事务回滚
        }

      }
    }

    return $res;                      // 返回上传信息
  }

  /**
   * 生成随机数
   * @return string 随机数
   */
  protected function getrandnums()
  {
    $arr = array();
    while (count($arr) < 10) {
      $arr[] = rand(1, 10);
      $arr = array_unique($arr);
    }
    return implode("", $arr);
  }
}

如果遇到报错,说没有文件上传,很有可能是因为图片验证规则设置maxFiles大于1了,改成1就好了。

请注意,以上代码,在本地测试环境下会报curl连接超时的错误,在服务器上运行是没有问题的。

免责声明:如果照搬本实例代码产生的损失,本人不负责。

你要根据自己的项目修改!!!要做好测试!!!

你要根据自己的项目修改!!!要做好测试!!!

你要根据自己的项目修改!!!要做好测试!!!

重要的事情说三遍。好了,祝你成功。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
php ob_flush,flush在ie中缓冲无效的解决方法
May 09 PHP
php 归并排序 数组交集
May 10 PHP
php中防止伪造跨站请求的小招式
Sep 02 PHP
php下载文件的代码示例
Jun 29 PHP
深入PHP nl2br()格式化输出的详解
Jun 05 PHP
CodeIgniter使用phpcms模板引擎
Nov 12 PHP
WordPress中邮件的一些修改和自定义技巧
Dec 15 PHP
解读PHP的Yii框架中请求与响应的处理流程
Mar 17 PHP
Laravel框架基于ajax和layer.js实现无刷新删除功能示例
Jan 17 PHP
Thinkphp5.0 框架Model模型简单用法分析
Oct 11 PHP
php实现简单四则运算器
Nov 29 PHP
详解PHP设计模式之依赖注入模式
May 25 PHP
yii2.0整合阿里云oss的示例代码
Sep 19 #PHP
PHP文件系统管理(实例讲解)
Sep 19 #PHP
Laravel学习教程之View模块详解
Sep 18 #PHP
php制作圆形用户头像的实例_自定义封装类源代码
Sep 18 #PHP
PHP中使用jQuery+Ajax实现分页查询多功能操作(示例讲解)
Sep 17 #PHP
PHP实现深度优先搜索算法(DFS,Depth First Search)详解
Sep 16 #PHP
PHP实现广度优先搜索算法(BFS,Broad First Search)详解
Sep 16 #PHP
You might like
这部番真是良心,画质好到像风景区,剧情让人跟着小公会热血沸腾
2020/03/10 日漫
BBS(php &amp; mysql)完整版(五)
2006/10/09 PHP
PHP CodeBase:将时间显示为&quot;刚刚&quot;&quot;n分钟/小时前&quot;的方法详解
2013/06/06 PHP
浅析PHP程序设计中的MVC编程思想
2014/07/28 PHP
js获取input标签的输入值实现代码
2013/08/05 Javascript
删除select中所有option选项jquery代码
2013/08/12 Javascript
给angular加上动画效遇到的问题总结
2016/02/17 Javascript
在微信、支付宝、百度钱包实现点击返回按钮关闭当前页面和窗口的方法
2016/08/05 Javascript
详解使用vscode+es6写nodejs服务端调试配置
2017/09/21 NodeJs
微信小程序实现分享朋友圈的图片功能示例
2019/01/18 Javascript
微信小程序位置授权处理方法
2019/06/13 Javascript
弱类型语言javascript开发中的一些坑实例小结【变量、函数、数组、对象、作用域等】
2019/08/07 Javascript
Jquery属性的获取/设置及样式添加/删除操作技巧分析
2019/12/23 jQuery
从局部变量和全局变量开始全面解析Python中变量的作用域
2016/06/16 Python
Python入门_浅谈数据结构的4种基本类型
2017/05/16 Python
使用Python写一个量化股票提醒系统
2018/08/22 Python
Python编程在flask中模拟进行Restful的CRUD操作
2018/12/28 Python
Python中如何导入类示例详解
2019/04/17 Python
详解python中的hashlib模块的使用
2019/04/22 Python
python找出一个列表中相同元素的多个索引实例
2019/06/11 Python
python字符串下标与切片及使用方法
2020/02/13 Python
5分钟快速掌握Python定时任务框架的实现
2021/01/26 Python
python实现简单文件读写函数
2021/02/25 Python
Madewell美德威尔美国官网:美国休闲服饰品牌
2016/11/25 全球购物
SAZAC的动物连体衣和动物睡衣:Kigurumi Shop
2020/03/14 全球购物
Ajax主要包含了哪些技术
2014/06/12 面试题
大四学生毕业自荐信
2013/11/07 职场文书
xxx同志考察材料
2014/02/07 职场文书
《周恩来的四个昼夜》观后思想汇报范文两篇
2014/09/10 职场文书
画展邀请函
2015/01/31 职场文书
2015年度内部审计工作总结
2015/05/20 职场文书
2015年税务稽查工作总结
2015/05/26 职场文书
学习经验交流会总结
2015/11/02 职场文书
elasticSearch-api的具体操作步骤讲解
2021/06/28 Java/Android
ubuntu如何搭建vsftpd服务器
2022/12/24 Servers