ThinkPHP5 实现七牛云图片上传功能

  • 背景
    最近在学习大佬的教程时,遇到七牛云图片上传的操作;
    发现若是有后期在线网站的开发需求,可以考虑选取;
    主要是很多网站在使用,可作为学习的小技能;
    在此做下记录,方便同样需求的小伙伴以作参考,同时也是自己的备忘经验,欢迎指摘 …

七牛云官方网站
PHP SDK 开发文档

> 本人使用的框架为:ThinkPHP5.0.24
> 其实,可以直接阅读官方文档,自行对照开发即可,后面的也只是我们的实际操作而已

▼ 前期准备

①. 开通七牛开发者帐号
②. 如果已有账号,点击【秘钥管理】查看 Access Key 和 Secret Key
③. 到 “对象存储” 新建一个存储空间 (公开空间),并记下 名称

④. 运行 Composer 命令安装最新稳定版本的 SDK

			php composer.phar require qiniu/php-sdk
	或:	composer require qiniu/php-sdk

▼ 开发步骤

①. 在 application/extra 中新建配置文件 qiniui.php

 return [
    'ak' => 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxx',//Access_Key
    'sk' => 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',//Secret_Key
    'bucket' => 'mz-7img',//空间名称
    'image_url' => 'xxxxxx.xxx.clouddn.com/',//外链域名
];

②. 在目录 /application/common/lib下,创建 Upload.php 类,源代码如下:

 <?php
/**
 * Created by PhpStorm.
 * User: moTzxx
 * Date: 2020/4/11
 * Time: 12:20
 */

namespace app\common\lib;
// 引入七牛鉴权类
use Qiniu\Auth;
use Qiniu\Config;
use Qiniu\Storage\BucketManager;
use Qiniu\Storage\UploadManager;

/**
 * 七牛云图片上传基础类库
 * Class Upload
 * @package app\common\lib
 */
class Upload
{
    /**
     * 七牛云图片上传操作
     * @return bool|string
     */
    public static function imageQiNiu(){
        // 要上传文件的临时文件
        $file = $_FILES['file']['tmp_name'];
        if (empty($file)){
            $message = "您提交的图片数据不合法";
            return false;
        }else{
            //拿到上传文件的格式
            $pathinfo = pathinfo($_FILES['file']['name']);
            //获取图片后缀名
            $ext = $pathinfo['extension'];
            $config = config('qiniu');
            //构建一个鉴权对象
            $auth = new Auth($config['ak'],$config['sk']);
            //生成上传的token
            $token = $auth->uploadToken($config['bucket']);

            //上传到七牛云后 保存的文件名
            $saveFileName = date("YmdHis").substr(md5($file),0,6).rand(0000,9999).".".$ext;

            //初始化UploadManager类
            $uploadMgr = new UploadManager();
            $opRes = $uploadMgr->putFile($token,$saveFileName,$file);
            if ($opRes[1] != null){
                return false;
            }else{
                return $saveFileName;
            }
        }
    }

    /**
     * 七牛云图片删除操作
     * @param $delFileName 七牛云图片名称,例:2020041208595410935c8386.jpg
     * @return bool
     */
    public static function delImgQiNiu($delFileName)
    {
        // 判断是否是图片
        $isImage = preg_match('/.*(\.png|\.jpg|\.jpeg|\.gif)$/', $delFileName);
        if(!$isImage){
            return false;
        }else{
            //七牛云账号配置信息
            $conf = config('qiniu');
            // 构建鉴权对象
            $auth = new Auth($conf['ak'],$conf['sk']);
            // 配置
            $config = new Config();
            // 管理资源
            $bucketManager = new BucketManager($auth, $config);

            // 删除文件操作
            $opRes = $bucketManager->delete($conf['bucket'], $delFileName);
            if (is_null($opRes)) {
                // 删除操作成功
                return true;
            }else{
                return false;
            }
        }
    }
}

③. 图片上传控件,点击操作进行 ajax 请求,则后台服务端处理逻辑参考如下:

     public function uploadQiNiu(Request $request){
        $status = 0;
        $data = [];
        if ($request->Method()== 'POST') {
            $image = Upload::imageQiNiu();
            if ($image){
                $status = 1;
                $data['url'] = config('qiniu.image_url').$image;
                $message = '上传成功';
            }else{
                $message = '上传失败';
            }
        }else{
            $message = "参数错误";
        }
        return showMsg($status, $message,$data);

    }
  • 后面就是针对自己的业务逻辑,自行优化代码了 …

附录:

  • 补充一个,直接从服务端将 docx 文件上传难道 七牛云服务器的封装方法
    Upload::qiNiuForServerSingleFile()

场景:自己的服务器对比较大的文件下载,太影响下载速度,所以提交到七牛云 (代码简要测试,可优化使用

    /**
     * 服务端文件,上传到七牛云服务器
     * @param string $file_name 文件名称(无扩展名后缀)
     * @param string $file_from_path 服务端所需上传文件的绝对地址 参考: app()->getRootPath().'public'.$word_file_url;
     * @param string $file_to_path  七牛云服务器中,要存储的目录 例:'task_words/'.$task_idstr??'';
     * @param string $ext_name 文件扩展名: txt 、docx
     * @return mixed|string
     * @throws \Exception
     */
    public static function qiNiuForServerSingleFile($file_name = '',$file_from_path = '',$file_to_path = '',$ext_name = 'txt'){
        $config = config('qiniu.');
        //构建一个鉴权对象
        $auth = new Auth($config['AK'],$config['SK']);
        //生成上传的token
        $token = $auth->uploadToken($config['BUCKET']);
        // 构建 UploadManager 对象
        $uploadMgr = new UploadManager();
        // 上传文件到七牛
        if (empty($file_name)){
            $file_name = md5(uniqid(microtime(true),true));
        }

        if (empty($file_to_path)){}

        $qiNiu_saveFileName = $file_to_path.'/'.$file_name.'.'.$ext_name;


        $opRes = $uploadMgr->putFile($token, $qiNiu_saveFileName, $file_from_path);
        if ($opRes[1] !== null) {
            //上传失败
            trace(json_encode(['title' => '上传七牛云失败', 'data' => $opRes[1]], JSON_UNESCAPED_UNICODE), 'error');
            return '';
        } else {
            //删除临时服务器txt文件
            unlink($file_from_path);
            return $qiNiu_saveFileName;
        }
    }
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值