PHP
之Laravel 使用qiniu/php-sdk, itbdw/laravel-storage-qiniu, 组件上传文件到七牛云.
一. 序言
这几天在laravel 框架上使用qiniu, 发现这类教程有些少, 所以就把自己的经验写下来, 以供大家参考一下.
在这里有两个组件可以使用, 一个是PHP 通用的qiniu/php-sdk, 只要使用PHP,就可以使用的通用组件,
而itbdw/laravel-storage-qiniu, 是其作者根据laravel 的特性优化qiniu/php-sdk 组件从而方便在laravel 上使用的文件上传组件. 感谢他们!
二. 前文
环境: php:7.0.12, laravel.
1) 首先, 建立一个小模块.
a) 链接地址
admin/test/fileupload
b) 路由
Route::group(['prefix' => 'admin', 'namespace' => 'Admin'], function() {
Route::get('test/fileupload', "TestController@fileUpload");
Route::post('test/upload', "TestController@upload");
});
c) 控制器展现视图
TestController/fileUpload
d) 视图
admin/test/fileupload
视图只需要一个表单, 加上input:file, 即可.
Tip: 要想上传文件, 须在更改form 表单编码, 这里介绍enctype. 文件上传时必须使用multipart/form-data.
<form action="{{url('admin/test/upload')}}" method="post" enctype="multipart/form-data">
. enctype: 规定在发送表单数据之前如何对其进行编码。有三种设置类型
默认为application/x-www-form-urlencoded:发送前编码所有字符
. multipart/form-data:不对字符编码,包含文件上传控件的表单时,必须使用该值
. text/plain:空格转换为 "+" 加号,但不对特殊字符编码。
e) 处理.
在这里选一张图片点击上传, form 表单提交到TestController/upload 控制器. dd 打印一下.
看到上传文件信息, 现在开始上传七牛云操作.
三. 安装
1) composer 下载qiniu/php-sdk, itbdw/laravel-storage-qiniu 两个组件.
这两个组件都可以在https://packagist.org/ 上搜到. 其实各个组件也都自带教程, 只是不针对.
2) 打开命令行cd 到laravel 文件夹下
cd ../laravel
(这里cd 你自己的地址)
3) 安装itbdw/laravel-storage-qiniu, qiniu/php-sdk
composer require itbdw/laravel-storage-qiniu
Tip: 这时候安装过程会出现一个错误.
doctrine / instantiator的安装请求(锁定在1.1.0) - >由doctrine / instantiator可以满足[1.1.0], 这个组件需要PHP ^7.1 版本, 所以我的版本不满足要求. 这时候安装doctrine/instantiator 即可, 在Packagist 上也能搜到, 作用是: 用于在不调用构造函数的情况下实例化PHP中的对象.
composer require doctrine/instantiator
会发现他给你倒退版本. 这时候再次安装itbdw/laravel-storage-qiniu 组件即可.
composer require itbdw/laravel-storage-qiniu
安装成功后, 会自动安装qiniu/php-sdk, 发现laravel/vendor 下有了itbdw, qiniu 两个文件夹.
四. 使用
a) itbdw/laravel-storage-qiniu
1. 在config/app.php里面的providers数组,加上一行
itbdw\QiniuStorage\QiniuFilesystemServiceProvider::class,
Tip: 这就相当于注册中间件一样, 告诉框架, 我在提供方里注册了一个新组件.
2. config/filesystem.php的里面disks数组加上:
'disks' => [
// 如果有多个 bucket,增加类似配置即可
'qiniu' => [
'driver' => 'qiniu',
'domain' => 'https://www.example.com', //你的七牛域名,支持 http 和 https,也可以不带协议,默认 http
'access_key' => '', //AccessKey
'secret_key' => '', //SecretKey
'bucket' => '', //Bucket名字
],
'qiniu_private' => [
'driver' => 'qiniu',
'domain' => 'https://www.example.com', //你的七牛域名,支持 http 和 https,也可以不带协议,默认 http
'access_key' => '', //AccessKey
'secret_key' => '', //SecretKey
'bucket' => 'qiniu_private', //Bucket名字
],
...
],
Tip: disks 数组里面有两个数组, 看名字也知道, 一个为正常情况下使用, 一个是私有的. 我只添加了一个通用的, 也就是第一个, 若有要保密的, 可用第二个.
. 在这里讲讲这几个参数.
'driver' # 就不讲了, 默认qiniu
'domain' => 'https://www.example.com',
// 你的七牛域名,(支持 http 和 https,也可以不带协议,默认 http)
'access_key' # 公钥
'secret_key' # 密钥
'bucket' # bucket 就是你空间的名字
3. itbdw/laravel-storage-qiniu 的使用不用引入命名空间, 直接使用. 其readme 中也有介绍方法, 两种, 但是可以结合用.
代码:
$disk = \Storage::disk('qiniu'); // 使用七牛云上传
$time = date('Y/m/d');
$filename = $disk->put($time, $request->file('file')); // 上传
$img_url = $disk->downloadUrl($filename); // 获取下载链接
打印一下获取的下载地址, 能看到说明已经上传成功了.
以你的域名和时间为前缀的图片地址就生成了, 这样你就可以以字符串的形式写入数据库, 引用的时候直接<img src=””, 即可.
4. qiniu/php-sdk
. 引入
在控制器中, use
use Qiniu\Storage\UploadManager;
use Qiniu\Auth;
在方法中
$file = $request->file('file');
// laravel 获取文件的信息, 若是平常PHP, 用$_FILES['file'].
$tmpPath = $file->getRealPath(); // 获取图片在本地绝对路径
$ext = $file->getClientOriginalExtension();
// 获取后缀名
$fileName = time() . rand(1000, 10000) . '.' . $ext;
// 拼接文件名
$accessKey = 'AccessKey'; # 公钥
$secretKey = 'SecretKey'; # 私钥
$upManager = new UploadManager();
$auth = new Auth($accessKey, $secretKey);
$token = $auth->uploadToken($bucketName); # 上传空间名称
list($ret, $error) = $upManager->putFile($token, $fileName, $tmpPath);
Tip: 文档中用的是put, 但我试过用put 不成功, 改为putFile.
// 把参数依次传入, 上传后打印一下, 看到效果即成功.
if ($error !== null) {
dd($error);
} else {
dd($ret);
}