基于thinkphp5.0.15, 可以扩展数据库保存
自己了个七牛云调用类,用的是官方SDK 7.2.3 直接将文件放到Qinui里
将整个Qinui文件夹放到 extend 即可。<?phpnamespace Qiniu;require "functions.php";//use app\index\model\AdminImg;use Qiniu\Storage\BucketManager;use Qiniu\Storage\UploadManager;use Think\Config;/**
* 七牛云 使用类
*/class Qnycn{ protected $accessKey ;//七牛云 访问ID
protected $secretKey ;//七牛云 访问密钥
protected $bucket;//空间名
protected $url;//空间对应的网址
protected $imgUrlArray;//上传返回的
/**
* 文件的前缀 以字母开头 /结束 prefix 如: 'image/jpg/'
* 可以在构造函数中用用户呢称取得配置
*/
public $prefix='' ; /**
* 图片上传配置,可在构造函数中从系统取值,不过就要去掉 static属性
*/
static private $imgconfig=array( 'types' => '.gif|.jpeg|.png|.bmp|.jpg',//图片类型
'size' => 2*1024*1024//文件大小 2M
); /**
* 构造函数
* 自动的初始化密钥和空间域名
* 可以在这里通过数据库处理这些
* @param string $prefix
*/
public function __construct($prefix=null)
{ $this->accessKey = Config::get('appkey.qnyaccessKey'); $this->secretKey = Config::get('appkey.qnysecretKey'); $this->bucket = Config::get('appkey.qnybucket'); $this->url = Config::get('appkey.qnyurl'); if($prefix){
(substr($prefix,-1) == '/')? $prefix : $prefix.'/';
}
} public function __get($name)
{ return $this->$name;
} /**
* 我的想法是多张图片上传,将返回的图片信息在最后保存到数据库
* */
public function __destruct()
{ //trace('bb','aaa');
} /**
* 网上抓取
* @access public
* @param string $url 网络上的图片地址
* @param string $suffix 文件后缀 默认JPG
* @return string $imgurl 图片地址
*/
public function fetchImg($url,$suffix='jpg')
{
$auth = new Auth($this->accessKey, $this->secretKey);
$bucketManager = new BucketManager($auth);
$key=date('YmdHis').rand(10000, 99999).'.'.$suffix; list($ret, $err) = $bucketManager->fetch($url, $this->bucket, $key); if ($err == null) { $this->saveToDB($ret['key']); return $this->url.$ret['key'];
}
} /**
* 取得上传的Token
* @access public
* @param string $url 网络上的图片地址
* @param string $suffix 文件后缀 默认JPG
* @return string $imgurl 图片地址
*/
public function authUploadToken()
{ //设置了回调地址,前端就不会返回值了。
$expires=array( 'returnBody'=>'{"key":"'.$this->url.'$(key)","hash":"$(etag)","fsize":$(fsize),"name":"$(x:name)"}', 'callbackUrl' => 'https://www.wyx2013.cn/wxapi/qiniucallback', 'callbackBody' => '{"key":"$(key)","hash":"$(etag)","fsize":$(fsize),"bucket":"$(bucket)","name":"$(x:name)","user":"admin"}', 'callbackBodyType' => 'application/json'
);
$auth = new Auth($this->accessKey, $this->secretKey); return $auth->uploadToken($this->bucket, null,600, $expires);//前端上传,第三个参数为时间,不用太长
} /**
* 图片上传
* @access public
* @param array $file 一个单图就是$_FILES[key] 含以下信息
* ["name"]=> string(9) "TS 37.jpg"
* ["type"] => string(10) "image/jpeg"
* ["tmp_name"] => string(14) "/tmp/phpAuVNJu"
* ["error"] => int(0)
* ["size"] => int(423024)
* 如果是单图上传 $keys = array_keys($_FILES);
* $key=$keys[0];
* if($_FILES[$key]['error'] == 0)
* $CLASS->->uploadimg($_FILES[$key]);
*
* @return string $imgurl 图片地址
*/
public function uploadimg($file)
{
$suffix=$this->checkimgfile($file['name'],$file['size']); if($suffix){
$img=$this->uploadFile($file['tmp_name'],$suffix);
$imgurl=$this->url.$img; $this->imgUrlArray[]=$img; return $imgurl;//返回的是一张图片的地址
}
} /**
* 多图上传 适用于 multiple 一定要加上
*
* @access public
* @param string $file 中的name值 不包括[]
* @return array $imgurlarray 图片地址数组
*/
public function uploadimgs($file='files')
{
$c=count($_FILES[$file]['error']); for($i=0;$i
$suffix=$this->checkimgfile($_FILES[$file]['name'][$i],$_FILES[$file]['size'][$i]); if($suffix){
$img=$this->uploadFile($_FILES[$file]['tmp_name'][$i],$suffix); if($img){
$imgurlarray[]=$this->url.$img;
}
}
} $this->saveToDB($imgurlarray); return $imgurlarray;//调用此方法,返回的是数组
} /**
* 文件删除
* @access public
* @param string $key 图片在空间的KEY值
* @return boolean 成功true 失败 false
*/
public function delete($key='')
{
$auth = new Auth($this->accessKey, $this->secretKey);// 构建鉴权对象
$bucketMgr = new BucketManager($auth);//初始化BucketManager
$err = $bucketMgr->delete($this->bucket, $key); return $err ? true : false ;
} /**
* 文件列表
* @access public
* @param Boolean $c 值为真即返 回数组 为假返回总数量
* @return array or int
*/
public function listFiles($c = false )
{
$auth = new Auth($this->accessKey, $this->secretKey);// 构建鉴权对象
$bucketMgr = new BucketManager($auth);
$bucket=$this->bucket;
$prefix = 'image/jpg/';//前缀
$marker = '';//标记
$limit = 10000;//条数
$delimiter = '/';//指定目录分隔符
list($iterms, $err) = $bucketMgr->listFiles($bucket, $prefix, $marker, $limit, $delimiter); if ($err !== null) { return false;//没有文件返回空
} else { if($c){ return $iterms; }else{ return count($iterms); }
}
} /**
* 图片检测并返回后缀
* @access private
* @param string $name 图片名
* @param int $size 图片大小
* @return string $suffix图片后缀
*/
public function checkimgfile($name,$size)
{
$suffix=pathinfo($name, PATHINFO_EXTENSION); //取得后缀
if(stripos(self::$imgconfig['types'],$suffix) && $size<:>
}else{ return false;
}
} /**
* 文件上传
* @access private
* @param file $fileOjb 本地临时文件地址
* @param string $suffix 文件后缀
* @return mixed 成功上传 返回文件的名
*/
private function uploadFile($fileOjb,$suffix )
{
$auth = new Auth($this->accessKey, $this->secretKey);// 构建鉴权对象
$bucket = $this->bucket;// 要上传的空间
$token = $auth->uploadToken($bucket);// 生成上传 Token
$uploadMgr = new UploadManager();// 构建 UploadManager 对象
$key=date('YmdHis').rand(10000, 99999) . '.' . $suffix;//文件名 用时间命名
$key=empty($this->prefix) ? $key : $this->prefix.$key; list($ret, $err) = $uploadMgr->putFile($token, $key, $fileOjb);//上传
return ($err !== null)? false : $ret['key'];
} /**
* 将图片保存到表格里面
* @access private
* @param string array $img 单个图片为或多个图片名
* @return mixed
*/
private function saveToDB($img )
{ //$m=new AdminImg();
if(is_string($img)){ //$m->img=$img;
//$m->imgurl=$imgurl;
//$m->save();
}elseif(is_array($img)){
$url=$this->url; foreach($img as $value){
$data[]=array('img'=>$value,'imgurl'=>$url.$value);
} //$m->saveAll($data);
}
}
}
这里只封装了部分功能
上传文件
返回值为[{"suc":"http:// xample.com/2018033122531446150.png"},{"suc":"xxxx"}]public function ajaxuploadimgs()
{ if ( !empty($_FILES) ) {
$q = new Qnycn(); foreach ($_FILES as $key=>$file){ if ($file['error'] !== 0) { continue;
} else {
$imgurl = $q->uploadimg($file,$key); if($imgurl){
$c[] = array('suc'=>$imgurl);
}else{
$c = array('err'=>'七牛云上传失败');
}
}
} return json_encode($c);
} return false;
}
如果是多个图片上传会产生一个问题,会调用多次类,可以将调用方也写到Qnycn的类里面。
附上jQuery上传代码。
$(document).ready(function(){
$("#ajaxfiles").change(function() { var paths = document.getElementById("ajaxfiles").files; var formData=new FormData(); for(var i=0;i
formData.append(paths[i].name,paths[i]);
}
$.ajax({ url: "/admin/ajaxuploadimgs", type: 'POST', data: formData, dataType:"json", processData: false, contentType: false, success: function (date) {
$.each(date, function(i, item){ if(item.suc){
alert(tem.suc);
}else {
alert(item.err);
}
});
}
});
});
});
作者:吴孝青
链接:https://www.jianshu.com/p/cf105fc67d9c