php 七牛云fetch,七牛云调用类
基于thinkphp5.0.15, 可以擴展數據庫保存
自己了個七牛云調用類,用的是官方SDK 7.2.3 直接將文件放到Qinui里
將整個Qinui文件夾放到 extend 即可。
namespace 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<:>
return $suffix;
}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
//將每個文件設置一個string類型的名字,放入到formData中,這里類似于setAttribute("",Object)
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);
}
});
}
});
});
});
總結
以上是生活随笔為你收集整理的php 七牛云fetch,七牛云调用类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java发送小程序模板消息,记录_小程序
- 下一篇: php 什么时候销毁对象,什么决定什么时