Laravel 简单使用七牛云服务

前言

路漫漫其修远兮,吾将上下而求索。学习 Laravel 之初觉得所有东西都很厉害的样子,现在看来就是很厉害啊!最近在写一个项目上传的模块,要上传图片到七牛云,昨天看了一下午七牛云官方的文档感觉还是迷迷糊糊的,今天尝试着写一写感觉满足我的要求还是蛮简单的,于是赶紧记录一下,每一篇博客都将是我进步的基石。

安装七牛云 SDK

composer require qiniu/php-sdk

获取密钥

首先到七牛云的官网注册账号登陆后,账号->密钥->创建新密钥:

然后新建一个空间,获取七牛域名:

最后将这些信息写到配置文件中:

QINIU_BUCKET=stu2e   //刚刚创建的空间名称,用来保存图片
QINIU_ACCESSKEY=ja_fS4iONGxJgX7h11oxmA0-KhJfrUmHkSMEb_7s
QINIU_SECRETKEY=aO36g6wnLyItch6jgIwglJR17TsR0IlcO5beooxt   // AK 和 SK 用来鉴权
QINIU_DOMAIN=7xn855.com1.z0.glb.clouddn.com   //图片上传成功后会返回一个 Key 值,domain/key 就是上传的资源的路径

SDK 使用

为了方便使用七牛云服务,于是我将它封装成一个服务,顺便复习以下 Laravel 的 Service 和 Facade 模式。具体的流程就不写了,直接写方法的实现吧~

require_once base_path().'/vendor/autoload.php';  
//base_path()获取 laravel 项目的根目录,引入 SDK

use Qiniu\Auth;
use Qiniu\Storage\UploadManager;

class QiniuService
{
    protected $domain = null;
    protected $bucket = null;
    protected $accessKey = null;
    protected $secretKey = null;
    protected $auth;

    public function __construct()
    {
        $this->domain = env('QINIU_DOMAIN');
        $this->bucket = env('QINIU_BUCKET');
        $this->accessKey = env('QINIU_ACCESSKEY');
        $this->secretKey = env('QINIU_SECRETKEY');

        $this->auth = new Auth($this->accessKey, $this->secretKey); //鉴权
    }

    public function upLoad($filePath)
    {
        $token = $this->getToken();   
        //上传时会对比上传表单中 post 过来的 token 是否正确
        $uploadMgr = new UploadManager();
        list($ret, $err) = $uploadMgr->putFile($token, null, $filePath); 
        //第二个参数是保存到空间的图片的名字,默认就好了。
        if ($err !== null) {
            return $err;
        } else {
            return $ret;
        }
    }
    
    public function getDomain()
    {
        return $this->domain;
    }

    public function getToken()
    {
        return $this->auth->uploadToken($this->bucket);  
        //給上传表单生成上传  token
    }

路由

use App\Http\Requests;
use Illuminate\Http\Request;

Route::get('/test', function(){
    $token = Qiniu::getToken();
    return view('test')->with('token', $token);
});

Route::post('/test',function(Request $request){
    $payload = $request->all();
    $result = Qiniu::upLoad($payload['file']);
    return Qiniu::getDomain().'/'.$result['key'];
});

HTML 页面

@extends('app')

@section('content')
<div class="container">
    <form method="post" action="{{ url('test') }}" enctype="multipart/form-data">
        <input type="hidden" name="_token" value="{{ csrf_token() }}">
        <input name="token" type="hidden" value="{{ $token }}">
        <input name="file" type="file" />
        <input type="submit" value="上传"/>
    </form>
</div>
@endsection

关于这个 token 问题,Laravel 默认开启了csrf防御机制,所以上传表单应该包括两个 token 。
ok,简单的上传图片就完成了,打开页面,选择一张图片,上传后就会返回该图片在七牛云空间里的资源路径,拷贝到浏览器地址栏,进入就能看到图片了。

原文地址:https://www.cnblogs.com/pengzhendong/p/4855076.html