php实现同步网络远程图片至七牛云

By | 2020年10月15日

我想很多同行都在使用七牛云作为存储图片文件的平台,大部分人是使用本地上传作为主要上传路径,而将网络图片直接同步至七牛云大家有想过怎么做吗。

其实同步网络图片至七牛云的主要应用场景无非是采集其他平台的资源,不想将图片下载至本地然后再批量上传,这样太麻烦,希望在采集的时候直接就可以同步至七牛云。

那么如何使用php实现呢?接下来就步入正题:

首先你得下载七牛云得php-sdk,这个您需要自行去七牛官方网站下载,下载下来直接部署得就ok了,都是封装好的类,只要引入路径不出错,就可以直接使用;

接下来就开始实现同步远程网络图片了:

$imageUrl="http://www.xxtaqi.com/ueditor/php/upload/image/20201014/1602688286752660.jpg";
$ft = getimagesize($imageUrl);  //获取网络图片的基本信息,(主要获取类型)
$result=false;
if ( $ft === false ) {	//如果失败,则使用备选方案
  //备选方案是将网络图片保存至本地,然后再获取图片信息
  $result=file_get_contents("compress.zlib://".$imageUrl);
  $filename=__DIR__.'/../../tempupload/'.time();  //此处路径根据实际情况进行修改
  file_put_contents($filename, $result);
  $ft = getimagesize($filename);
  unlink($filename);  //获取到图片信息后删除保存的临时图片,节约本地空间
  if( $ft === false ){
    return false;
  }
}
$mime=$ft['mime'];
switch ($mime) {  //这里获取图片的后缀,以便接下来保存至七牛云所用
        	case 'image/jpeg':
        		$type="jpg";
        		break;
        	case 'image/jpg':
        		$type="jpg";
        		break;
        	case 'image/png':
        		$type="png";
        		break;
        	case 'image/gif':
        		$type="gif";
        		break;
        	case 'image/webp':
        		$type="webp";
        		break;
        	default:
        		$type="";
        		break;
}
if($result===false){  //如以上获取图片信息未使用到备选方案,则重新获取图片流
        	//获取图片流
		$ch = curl_init();
	        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
	        curl_setopt($ch, CURLOPT_HEADER, false);
	        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
	        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
	        curl_setopt($ch, CURLOPT_URL, $imageUrl);
	        curl_setopt($ch, CURLOPT_REFERER, $imageUrl);
	        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
	        $result = curl_exec($ch);
	        curl_close($ch);
        }
$n=new qiniu();  //实例化封装好的类,前提您已经引入类了(如需封装类实例请看下方代码)
$res=$n->qiniuUploadImg(["data"=>$result,"type"=>$type,"mime"=>$mime]);
//至此同步网络图片至七牛云结束了

七牛云获取token、删除图片、同步网络图片的封装类实例:

<?php
namespace backstage\controller;
require_once __DIR__ . '/../../include/Qiniu/autoload.php';  //根据实际情况修改
use Qiniu\Auth;  //必须
use Qiniu\Storage\UploadManager;  //必须,同步网络图片需要用到
class qiniu
{
	protected $accessKey = null;
	protected $secretKey = null;
	protected $bucket = null;
	public function __construct(){
		$this->accessKey = C('qiniu_access_key');
		$this->secretKey = C('qiniu_secret_key');
		$this->bucket = C('qiniu_bucket');
	}
	//获取token
	public function qiniuToken(){
		if(is_post()){
			// 初始化 Auth 状态
			$auth = new Auth($this->accessKey, $this->secretKey);
			// 设置凭证有效期(单位秒)
			$expires = 3600;
			$policy = null;
			$upToken = $auth->uploadToken($this->bucket, null, $expires, $policy, true);
			json(["success"=>true,"data"=>$upToken]);
		}
	}
	//删除图片
	public function qiniuDelFile($pkey=null){
		if($pkey===null){
			if(!is_post()) return false;
		}else{
			$key=$pkey;
		}
		$getParams=p("p.");
		$key = isset($getParams['key'])?trim($getParams['key']):"";
		if(empty($key)){
			json(["success"=>false,"msg"=>'请提交删除的文件key']);
		}
		$auth = new Auth($this->accessKey, $this->secretKey);
		$config = new \Qiniu\Config();
		$bucketManager = new \Qiniu\Storage\BucketManager($auth, $config);
		list($fileInfo, $err) = $bucketManager->stat($this->bucket, $key);
		if(!$err){
			$bucketManager = new \Qiniu\Storage\BucketManager($auth, $config);
			$err = $bucketManager->delete($this->bucket, $key);
			if ($err[1]) {
			    json(["success"=>false,"msg"=>'删除失败,请检查文件key']);
			}else{
				$keyName=explode('.', $key);
				$suffix=$keyName[count($keyName)-1];
				unset($keyName[count($keyName)-1]);
				$keyName=implode(".", $keyName);
				$r=M()->table("t_picture_space")->where("`key`='$keyName' AND `suffix`='$suffix'")->delete();
				if($pkey===null) json(["success"=>true,"msg"=>'删除成功']);
			}
		}else{
			json(["success"=>false,"msg"=>'删除失败,请检查文件key']);
		}	
		
	}

//上传图片
public function qiniuUploadImg($imageData){
		$auth = new Auth($this->accessKey, $this->secretKey);
		// 设置凭证有效期(单位秒)
		$expires = 3600;
		$policy = null;
		$upToken = $auth->uploadToken($this->bucket, null, $expires, $policy, true);
		$key = 'atcont_'.time()."_".mt_rand(999,1800).'.'.$imageData['type'];
        $up    = new UploadManager();
        $mime  = $imageData['mime'];
        list($rest, $err) = $up->put($upToken, $key, $imageData['data'], null, $mime);
        if ($err) {
        	return false;
        }
        return ["key"=>$key];
	}

}
?>

发表评论

电子邮件地址不会被公开。 必填项已用*标注