thinkphp5.0整合七牛云项目实践,原来thinkphp3.2版本自带了七牛上传驱动。
5.0版本没有,需要自己整合进去。因为最近几个项目图片都使用了七牛,所以准备整合进去。
准备资料:
1: 七牛账号(http://developer.qiniu.com/),进去开发者账号,有api和demo代码段。
2:有使用百度的wubuploader的图片上传插件。
3:准备一张数据表,存储图片数据表(admin_upload)
sql语句准备
CREATE TABLE `oc_admin_upload` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
`uid` int(11) unsigned NOT NULL DEFAULT '0' COMMENT 'UID',
`name` varchar(255) NOT NULL DEFAULT '' COMMENT '文件名',
`path` varchar(255) NOT NULL DEFAULT '' COMMENT '文件路径',
`url` varchar(255) NOT NULL DEFAULT '' COMMENT '文件链接',
`ext` char(4) NOT NULL DEFAULT '' COMMENT '文件类型',
`size` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '文件大小',
`md5` char(32) NOT NULL DEFAULT '' COMMENT '文件md5',
`sha1` char(40) NOT NULL DEFAULT '' COMMENT '文件sha1编码',
`location` varchar(15) NOT NULL DEFAULT '' COMMENT '文件存储位置',
`download` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '下载次数',
`create_time` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '上传时间',
`update_time` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '修改时间',
`sort` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '排序',
`status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '状态',
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='文件上传表';
七牛sdk准备
1:下载sdk包
2:解压
3:放入项目目录
后台php代码:
<?php
// +----------------------------------------------------------------------
// | mydinghuo [easy handle for your businesses]
// +----------------------------------------------------------------------
// | Copyright (c) 2016 http://www.weizhibao.com All rights reserved.
// +----------------------------------------------------------------------
// | Author: kevinyang <kevinyang@vip.qq.com> <http://www.weizhibao.com>
// +----------------------------------------------------------------------
namespace app\admin\controller;
use think\Controller;
use think\Db;
use think\Config;
use think\Request;
use think\File;
use Qiniu\Auth;
use Qiniu\Storage\UploadManager;
class Uploader extends Controller
{
/**
* 图片上传,ajax返回
* @author <835173372@qq.com>
*/
public function upload(){
$upload_config = Config::get('UPLOAD_DRIVER');
if($upload_config == 'Local'){
$this->local_upload();//本地存储图片
}
if($upload_config == 'Qiniu'){
$this->qiniu_upload();//七牛云存储
}
}
public function local_upload(){
$filePath = $_FILES['file']['tmp_name'];
$file = new File($filePath);
$info = $file->webuploader_move(ROOT_PATH . 'public' . DS . 'uploads');
if($info){
$data['name'] = $info->getFilename();
$data['md5'] = $info->hash('sha1');
$data['sha1'] = $info->hash('md5');
$data['ext'] = 'jpg';
$data['path'] = '/uploads/' . $info->getSaveName() . 'jpg';
$data['location'] = 'location';
$data['create_time'] = time();
$data['status'] = 1;
$id = Db::name("admin_upload")->insertGetId($data);//插入图片数据
if($id > 0){
$return['path'] = $data['path'];
$return['name'] = $data['name'];
$return['id'] = $id;
}else{
$return['error'] = 1;
$return['success'] = 0;
$return['status'] = 0;
$return['message'] = '上传出错'.$file->getError();
}
}else{
// 上传失败获取错误信息
$return['error'] = 1;
$return['success'] = 0;
$return['status'] = 0;
$return['message'] = '上传出错'.$file->getError();
}
exit(json_encode($return));
}
/**
* 图片上传,ajax返回
* 七牛云存储图片(同时保留本地备份数据
* @author <835173372@qq.com>
*/
public function qiniu_upload(){
require_once EXTEND_PATH.'Qiniu/autoload.php';
$config = Config::get('UPLOAD_Qiniu_CONFIG');
$accessKey = $config['accessKey'];
$secretKey = $config['secretKey'];
$auth = new Auth($accessKey, $secretKey);
$bucket = $config['bucket'];// 要上传的空间
$token = $auth->uploadToken($bucket);// 生成上传 Token
// 要上传文件的本地路径
$filePath = $_FILES['file']['tmp_name'];
$file = new File($filePath);
$info = $file->webuploader_move(ROOT_PATH . 'public' . DS . 'uploads');//本地上传
// 上传到七牛后保存的文件名
if($info){
$key = $info->getFilename();
}else{
$key = md5(time()).'.png';
}
// 初始化 UploadManager 对象并进行文件的上传
$uploadMgr = new UploadManager();
// 调用 UploadManager 的 putFile 方法进行文件的上传
list($ret, $err) = $uploadMgr->putFile($token, $key, $filePath);
if ($err === null) {
$data['url'] = $config['domain'].$ret['key'];
}
if($info){
$data['name'] = $info->getFilename();
$data['md5'] = $info->hash('sha1');
$data['sha1'] = $info->hash('md5');
$data['ext'] = 'jpg';
$data['path'] = '/uploads/' . $info->getSaveName() . 'jpg';
$data['location'] = 'location';
$data['create_time'] = time();
$data['status'] = 1;
$id = Db::name("admin_upload")->insertGetId($data);//插入图片数据
if($id > 0){
$return['path'] = $data['path'];
$return['name'] = $data['name'];
$return['id'] = $id;
}else{
$return['error'] = 1;
$return['success'] = 0;
$return['status'] = 0;
$return['message'] = '上传出错'.$file->getError();
}
}else{
// 上传失败获取错误信息
$return['error'] = 1;
$return['success'] = 0;
$return['status'] = 0;
$return['message'] = '上传出错'.$file->getError();
}
exit(json_encode($return));
}
}
使用到的配置文件:
<?php
//配置文件
return [
// 文件上传默认驱动
'UPLOAD_DRIVER' => 'Qiniu', //设置七牛上传驱动
//'UPLOAD_DRIVER' => 'Local',
// 七牛上传驱动配置说明
'UPLOAD_Qiniu_CONFIG' => array(
'secretKey' => 'LnEXgP-8F4nKn8HWzNWOF7kYXCyyYmIu', //七牛服务器
'accessKey' => 'u1mpysU6FBNULGuJcVzGgQLJJ1zqBc3uhI', //七牛用户
'domain' => 'http://oetqv9f47.bkt.clouddn.com/', //七牛域名
'bucket' => 'test2', //空间名称
'timeout' => 300, //超时时间
),
];
在使用时候注意以下几点:
1:配合前端webuploader上传组件,核心代码段:
// 初始化Web Uploader
uploader = WebUploader.create({
// 自动上传。
auto: true,
// swf文件路径
swf: './public/static/plugins/webuploader/Uploader.swf',
// 文件接收服务端。
server: 'http://www.test2.com/admin/uploader/upload',
// 选择文件的按钮。可选。
// 内部根据当前运行是创建,可能是input元素,也可能是flash.
pick: '#filePicker',
accept: {
title: 'Images',
extensions: 'jpg,jpeg,png',
mimeTypes: 'image/jpg,image/jpeg,image/png' //修改这行
}
});
做这个组件开发是需要一定的编码水品的。
需要熟悉前端webuploader组件,还要熟练使用php代码对接七牛云存储。