前言
路漫漫其修远兮,吾将上下而求索。学习 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 项目的根目录,引入 SDKuse 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,简单的上传图片就完成了,打开页面,选择一张图片,上传后就会返回该图片在七牛云空间里的资源路径,拷贝到浏览器地址栏,进入就能看到图片了。