首页 > Web开发 > 详细

阿里云OSS文件上传封装

时间:2019-08-13 09:35:47      阅读:119      评论:0      收藏:0      [点我收藏+]

1.先用composer安装阿里云OSS的PHPSDK

技术分享图片

2.配置文件里定义阿里云OSS的秘钥

技术分享图片

3.在index控制器里的代码封装

<?php

namespace app\index\controller;

use OSS\OssClient;
use OSS\Core\OssException;
use OSS\Core\OssUtil;
use think\Config;

class Index extends Base
{
    // 阿里OSS相关参数
    protected $accessKeyId = ‘‘;
    protected $accessKeySecret = ‘‘;
    protected $endpoint = ‘‘;
    protected $bucket = ‘‘;
    // 文件上传相关设置
    protected $image_size = 0;
    protected $video_size = 0;
    protected $other_size = 0;

    /**
     * 构造函数
     */
    public function _initialize()
    {
        $this->accessKeyId = Config::get(aliyun_oss)[accessKeyId];
        $this->accessKeySecret = Config::get(aliyun_oss)[accessKeySecret];
        $this->endpoint = Config::get(aliyun_oss)[endpoint];
        $this->bucket = Config::get(aliyun_oss)[bucket];
        $this->image_size = Config::get(upload_set)[image_size];
        $this->video_size = Config::get(upload_set)[video_size];
        $this->other_size = Config::get(upload_set)[other_size];
    }

    /**
     * 测试页面
     */
    public function index()
    {
        return $this->fetch();
    }

    /**
     * 创建存储空间
     */
    public function createBucket()
    {
        if (!request()->isPost()) {
            throw new \think\Exception(请求方式错误!);
        }
        $bucket = input(param.bucket);
        if (empty($bucket)) {
            return json([data => ‘‘, code => 1, message => 存储空间名不能为空!]);
        }
        try {
            $ossClient = new OssClient($this->accessKeyId, $this->accessKeySecret, $this->endpoint);
            $ossClient->createBucket($bucket);
            return json([data => ‘‘, code => 0, message => $bucket . 存储空间创建成功]);
        } catch (OssException $e) {
            return json([data => $e->getMessage(), code => 1, message => 创建失败]);
        }
    }

    /**
     * 上传文件
     */
    public function uploadFile()
    {
        /*判断提交方式*/
        if (!request()->isPost()) {
            throw new \think\Exception(请求方式错误!);
        }
        /*获取到上传的文件*/
        $file = $_FILES[file];
        if (!$file) {
            return json([data => ‘‘, code => 1, message => 文件不存在!]);
        }
        // 判断文件大小
        if ($file[size] > $this->other_size) {
            return json([data => ‘‘, code => 1, message => 文件大小不能超过 . ($this->other_size / 1024 / 1024) . M]);
        }
        $name = $file[name];
        $format = strrchr($name, .);//截取文件后缀名如 (.jpg)
        /*判断图片格式*/
        $allow_type = [.zip, .rar, .doc,.docx,xls,xlsx,mp3,wav];
        if (!in_array($format, $allow_type)) {
            return json([data => ‘‘, code => 1, message => 文件格式不在允许范围内]);
        }
        // 尝试执行
        try {
            //实例化对象 将配置传入
            $ossClient = new OssClient($this->accessKeyId, $this->accessKeySecret, $this->endpoint);
            //这里是有sha1加密 生成文件名 之后连接上后缀
            $fileName = upload/file/ . date("Ymd") . / . sha1(date(YmdHis, time()) . uniqid()) . $format;
            //执行阿里云上传
            $result = $ossClient->uploadFile($this->bucket, $fileName, $file[tmp_name]);
            /*组合返回数据*/
            $arr = [
                oss_url => $result[info][url],  //上传资源地址
                relative_path => $fileName     //数据库保存名称(相对路径)
            ];
        } catch (OssException $e) {
            return json([data => $e->getMessage(), code => 1, message => 上传失败!]);
        }
        //将结果返回
        return json([data => array(file => $arr[oss_url]), code => 0, message => 成功上传到oss]);
    }

    /**
     * 上传视频
     */
    public function uploadVideo()
    {
        /*判断提交方式*/
        if (!request()->isPost()) {
            throw new \think\Exception(请求方式错误!);
        }
        /*获取到上传的文件*/
        $file = $_FILES[file];
        if (!$file) {
            return json([data => ‘‘, code => 1, message => 文件不存在!]);
        }
        // 判断文件大小
        if ($file[size] > $this->video_size) {
            return json([data => ‘‘, code => 1, message => 视频大小不能超过 . ($this->video_size / 1024 / 1024) . M]);
        }
        $name = $file[name];
        $format = strrchr($name, .);//截取文件后缀名如 (.jpg)
        /*判断图片格式*/
        $allow_type = [.mp4, .avi, .rmvb];
        if (!in_array($format, $allow_type)) {
            return json([data => ‘‘, code => 1, message => 视频格式不在允许范围内]);
        }
        // 尝试执行
        try {
            //实例化对象 将配置传入
            $ossClient = new OssClient($this->accessKeyId, $this->accessKeySecret, $this->endpoint);
            //这里是有sha1加密 生成文件名 之后连接上后缀
            $fileName = upload/video/ . date("Ymd") . / . sha1(date(YmdHis, time()) . uniqid()) . $format;
            //执行阿里云上传
            $result = $ossClient->uploadFile($this->bucket, $fileName, $file[tmp_name]);
            /*组合返回数据*/
            $arr = [
                oss_url => $result[info][url],  //上传资源地址
                relative_path => $fileName     //数据库保存名称(相对路径)
            ];
        } catch (OssException $e) {
            return json([data => $e->getMessage(), code => 1, message => 上传失败!]);
        }
        //将结果返回
        return json([data => array(file => $arr[oss_url]), code => 0, message => 成功上传到oss]);
    }

    /**
     * 上传图片
     */
    public function uploadImage()
    {
        /*判断提交方式*/
        if (!request()->isPost()) {
            throw new \think\Exception(请求方式错误!);
        }
        /*获取到上传的文件*/
        $file = $_FILES[file];
        if (!$file) {
            return json([data => ‘‘, code => 1, message => 文件不存在!]);
        }
        // 判断文件大小
        if ($file[size] > $this->image_size) {
            return json([data => ‘‘, code => 1, message => 视频大小不能超过 . ($this->image_size / 1024 / 1024) . M]);
        }
        $name = $file[name];
        $format = strrchr($name, .);//截取文件后缀名如 (.jpg)
        /*判断图片格式*/
        $allow_type = [.jpg, .jpeg, .gif, .bmp, .png];
        if (!in_array($format, $allow_type)) {
            return json([data => ‘‘, code => 1, message => 图片格式不在允许范围内]);
        }
        // 尝试执行
        try {
            //实例化对象 将配置传入
            $ossClient = new OssClient($this->accessKeyId, $this->accessKeySecret, $this->endpoint);
            //这里是有sha1加密 生成文件名 之后连接上后缀
            $fileName = upload/image/ . date("Ymd") . / . sha1(date(YmdHis, time()) . uniqid()) . $format;
            //执行阿里云上传
            $result = $ossClient->uploadFile($this->bucket, $fileName, $file[tmp_name]);
            /*组合返回数据*/
            $arr = [
                oss_url => $result[info][url],  //上传资源地址
                relative_path => $fileName     //数据库保存名称(相对路径)
            ];
        } catch (OssException $e) {
            return json([data => $e->getMessage(), code => 1, message => 上传失败!]);
        }
        //将结果返回
        return json([data => array(file => $arr[oss_url]), code => 0, message => 成功上传到oss]);
    }

    /**
     * 上传图片base64
     */
    public function uploadImageBase64()
    {
        // 判断提交方式及图片类型
        if (!request()->has(base64, post)) {
            return json([data => ‘‘, code => 1, message => 请求方式错误,或图片非base64格式类型]);
        }
        $data = $_POST[base64];
        $result = $this->new_base64_upload($data);
        if ($result[code] !== 200) {
            return json([data => ‘‘, code => 1, message => $result[msg]]);
        }
        $fileResult = &$result[data];
        $filePath = $fileResult[path] . $fileResult[name];
        $ossFileName = implode(/, [upload/image, date(Ymd), $fileResult[name]]);
        try {
            //实例化对象 将配置传入
            $ossClient = new OssClient($this->accessKeyId, $this->accessKeySecret, $this->endpoint);
            $result = $ossClient->uploadFile($this->bucket, $ossFileName, $filePath);
            $arr = [
                oss_url => $result[info][url],  //上传资源地址
                relative_path => $ossFileName     //数据库保存名称(相对路径)
            ];
        } catch (OssException $e) {
            return json([data => $e->getMessage(), code => 1, message => 上传失败]);
        }
        unlink($filePath);
        return json([data => array(file => $arr[oss_url]), code => 0, message => 成功上传到oss]);
    }

    /**
     * 将Base64数据转换成二进制并存储到指定路径
     */
    protected function new_base64_upload($base64, $image_path = upload/posts/)
    {
        $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)) {
            return [code => 400, msg => 文件格式错误];
        }
        $type = $result[2];
        if (!in_array($type, array(jpeg, jpg, gif, bmp, png))) {
            return [code => 400, msg => 文件格式不在允许范围内];
        }
        $image_name = md5(uniqid()) . . . $result[2];
        $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];
        }
    }
}

 

阿里云OSS文件上传封装

原文:https://www.cnblogs.com/wordblog/p/11343628.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!