php 阿里云 oss 图片上传- thinkphp5整套流程

7 篇文章 0 订阅
5 篇文章 0 订阅

一、这里演示手动引入方法,因为这个会了基本原理就清晰了!

(compose安装的 默认安装在vendor目录下面,按下面方面走,路径变一下就OK了)

1、下载后解压-重新命名(我命名为aliyun_oss)

2、引入到项目里:复制上面文件到  extend/org下面,如果是composer安装会自动创建在vendor目录下面

3、在入口文件index.php文件里引入自动加载文件 autoload.php

4、在config.php中添加OSS配置文件

 //阿里云OSS配置
    'aliyun_oss' => [
        'KeyId'      => '',  //您的Access Key ID
        'KeySecret'  => '',  //您的Access Key Secret
        'Endpoint'   => 'oss-cn-hangzhou.aliyuncs.com',  //oss endpoint
        'Bucket'     => ''   //Bucket名称
    ],

              以上参数获取方法:

          注意:

                1.Bucket 就是你创建的储存空间名字,所有的文件都保存在此目录下面,其下可以创新更多目录,下面是我成功上传后返回的oss图片路径示例:

                2.建议选择公共读,要不然你上传成功后返回的oss图片路径不能被直接访问,需要身份参数

5、图片上传代码:

        说明:我写了兼容表单文件上传和base64图片上传两种,如果接收到base64字段就走base64图片上传代码段,如果接收到file字段就走表单图片上传代码段

               ①base64图片上传代码中还调用了自己封装的new_base64_upload方法代码如下:

<?php

namespace app\api\controller\v2;

use app\api\controller\Api;
use app\common\model\Db as DbModel;
use app\common\model\Video as VideoModel;
use think\Controller;
use think\Request;
use OSS\OssClient;
use OSS\Core\OssException;
use think\Image;
use think\Config;

class ceshi extends Api
{
    
    /* OSS图片上传
    * liwei
    * */
    public function oss_uploadImage()
    {
        if(request()->has('base64', 'post')){
            $data = $_POST['base64'];
            $result = $this->new_base64_upload($data);
            if ($result['code'] === 200){
                $fileResult = &$result['data'];
                $filePath = $fileResult['path'] . $fileResult['name'];
                $ossFileName = implode('/', ['upload/image',date('Ymd'),$fileResult['name']]);
                try {
                    $config = config('aliyun_oss');
                    //实例化对象 将配置传入
                    $ossClient = new OssClient($config['KeyId'], $config['KeySecret'], $config['Endpoint']);
                    $result = $ossClient->uploadFile($config['Bucket'], $ossFileName, $filePath);
                    $arr = [
                        'oss_url' => $result['info']['url'],  //上传资源地址
                        'relative_path' => $ossFileName     //数据库保存名称(相对路径)
                    ];
                } catch (OssException $e) {
                    return $e->getMessage();
                }finally {
                    unlink($filePath);
                }
                $this->jsonReturn(0, '成功oss', array('file' => $arr['oss_url']));
            }
            $this->jsonReturn(400, $result['msg']);
        }else{
            /*获取到上传的文件*/
            //$file = request()->file('file');
            $file = $_FILES['file'];
            if ($file) {
                $name = $file['name'];
                $format = strrchr($name, '.');//截取文件后缀名如 (.jpg)
                /*判断图片格式*/
                $allow_type = ['.jpg', '.jpeg', '.gif', '.bmp', '.png'];
                if (! in_array($format, $allow_type)) {
                    $this->jsonReturn(400, "文件格式不在允许范围内哦");

                }
                // 尝试执行
                try {
                    $config = config('aliyun_oss');
                    //实例化对象 将配置传入
                    $ossClient = new OssClient($config['KeyId'], $config['KeySecret'], $config['Endpoint']);
                    //这里是有sha1加密 生成文件名 之后连接上后缀
                    $fileName = 'uplaod/image/' . date("Ymd") . '/' . sha1(date('YmdHis', time()) . uniqid()) . $format;
                    //执行阿里云上传
                    $result = $ossClient->uploadFile($config['Bucket'], $fileName, $file['tmp_name']);
                    /*组合返回数据*/
                    $arr = [
                        'oss_url' => $result['info']['url'],  //上传资源地址
                        'relative_path' => $fileName     //数据库保存名称(相对路径)
                    ];
                } catch (OssException $e) {
                    return $e->getMessage();
                }
                //将结果返回
                $this->jsonReturn(0, '成功上传到oss', array('file' => $arr['oss_url']));
            }
            $this->jsonReturn(400, "文件不存在");
        }
    }

          ②下面new_base64_upload方法如果看不懂的话直接复制过去,学着调用用就OK了,先实现功能以后,自己再一步步打印调试研究哦!

/**
     * 将Base64数据转换成二进制并存储到指定路径
     * @param        $base64
     * @param string $path
     * liwei
     * @return array
     */
    public function new_base64_upload($base64, $path = '') {
        $data = explode(',',$base64);
        trace($data,'api');
        unset($base64);
        if (count($data) !== 2){
            return['code'=>400,'msg'=>'文件格式错误'];
        }
        if (preg_match('/^(data:\s*image\/(\w+);base64)/', $data[0], $result)){
            $type = $result[2];
            if(!in_array($type,array('jpeg','jpg','gif','bmp','png'))){
                return['code'=>400,'msg'=>'文件格式不在允许范围内'];
            }
            $image_name = md5(uniqid()).'.'.$result[2];
            $image_path = "./upload/posts/";
            $image_file = $image_path . $image_name;
            //服务器文件存储路径
            try {
                if (file_put_contents($image_file, base64_decode($data[1]))) {
                    return['code'=>200, 'msg'=>'成功', 'data'=>['name' => $image_name, 'path' => $image_path]];
                } else {
                    return['code'=>400,'msg'=> '文件保存失败'];
                }
            }catch (\Exception $e){
                $msg = $e->getMessage();
                return['code'=>400,'msg'=>$msg];
            }
        }
        return['code'=>400,'msg'=>'文件格式错误'];
    }

            ③温馨提示:记得加入use 这几行代码

use think\Controller;
use think\Request;
use OSS\OssClient;
use OSS\Core\OssException;
use think\Image;
use think\Config;

 

 

  • 3
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值