我们生成的二维码图片,一般来说是要上传到阿里云oss,而不是保存到我们自己的服务器上面,自己数据库上面保存图片地址即可。但是生成二维码图片又在我们本地,我们需要将本地生成的图片上传阿里云后删除本地服务器上面的图片。
废话不多说,直接上
第一步,封装一个上传阿里oss的类
(这一步涉及到thinkphp5整合oss,详情参见我的另外一篇博客:https://blog.csdn.net/qq_27930635/article/details/96991106)
<?php
namespace app\common\controller;
use think\Controller;
use think\Config;
use think\Image;
use OSS\OssClient;
use OSS\Core\OssException;
class Alioss extends Controller
{
/*
测试函数
public function index(){
return $this->fetch('user/index');
}*/
/**
* 单文件上传
* $file = request()->file('file'); //获取到上传的文件
* @param $file
* @return array|string
*/
public function uploadFile($file)
{
import('alioss.autoload',EXTEND_PATH,'.php');
$resResult = Image::open($file);
// 尝试执行
try {
$config = Config::get('aliyunOss'); //获取Oss的配置
//实例化对象 将配置传入
$ossClient = new OssClient($config['KeyId'], $config['KeySecret'], $config['Endpoint']);
//这里是有sha1加密 生成文件名 之后连接上后缀
$fileName = sha1(date('YmdHis', time()) . uniqid()) . '.' . $resResult->type();
//执行阿里云上传
$result = $ossClient->uploadFile($config['Bucket'], $fileName, $file->getInfo()['tmp_name']);
$arr = [
'address:' => $result['info']['url'],
];
return $arr;
} catch (OssException $e) {
return $e->getMessage();
}
//将结果输出
dump($arr);
}
/**
* 多图片上传
* @param $file_arr
* @return array|string
*/
public function uploadarr($file_arr){
import('alioss.autoload',EXTEND_PATH,'.php');
foreach($file_arr as $key=>$val){
$resResult = Image::open($val);
// 尝试执行
try {
$config = Config::get('aliyunOss'); //获取Oss的配置
//实例化对象 将配置传入
$ossClient = new OssClient($config['KeyId'], $config['KeySecret'], $config['Endpoint']);
//这里是有sha1加密 生成文件名 之后连接上后缀
$fileName = sha1(date('YmdHis', time()) . uniqid()) . '.' . $resResult->type();
//执行阿里云上传
$result = $ossClient->uploadFile($config['Bucket'], $fileName, $val->getInfo()['tmp_name']);
$arr[$key] = $result['info']['url'];
} catch (OssException $e) {
return $e->getMessage();
}
}//endforeach
return $arr;
}
/**
* 创建goods_img 删除多图片
* @param $token
*/
public function rm_image($objects){
// 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
import('alioss.autoload',EXTEND_PATH,'.php');
try{
$config = Config::get('aliyunOss'); //获取Oss的配置
$ossClient = new OssClient($config['KeyId'], $config['KeySecret'], $config['Endpoint']);
$ossClient->deleteObjects($config['Bucket'], $objects);
} catch(OssException $e) {
printf(__FUNCTION__ . ": FAILED\n");
printf($e->getMessage() . "\n");
return;
}
}
}
第二步:生成二维码并且利用curl上传
<?php
namespace app\shangjia\controller;
use app\common\controller\Base;
use think\Image;
use app\common\controller\Alioss;
use think\Db;
class Qrcode extends Base
{
public function qrcode($s_id)
{
$res=Db::table('wd_user')->where(array('user_id'=>$s_id))->field('qrcode')->find();
if($res['qrcode']){
return json(['code'=>200,'url'=>$res['qrcode']]);
}
$png_url = ROOT_PATH . 'public' . DS . 'qrcode'.DS.'2.png';
$errorCorrentionLevel = 'L'; //容错级别
$matrixPoinSize = 6; //生成图片大小
//生成二维码,第二个参数为二维码保存路径
$val = 'http://mcg.pooof.cn/html/shop/index.html?sid='.$s_id;
vendor('phpqrcode.phpqrcode');//引入插件类
\QRcode::png($val, $png_url, $errorCorrentionLevel, $matrixPoinSize, 2);//注意前面的反斜杠,因为插件中的类是没有命名空间的,要在前面加一个反斜杠
$url = 'http://换成你自己的地址/shangjia/Qrcode/uploadtooss';
$png_url = ROOT_PATH . 'public' . DS . 'qrcode'.DS.'2.png';
$curl = curl_init();
$data = array('file' => new \CURLFile(realpath($png_url)),'user_id'=>$s_id);
curl_setopt($curl, CURLOPT_SAFE_UPLOAD, true);
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_POST, 1 );
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_USERAGENT,"TEST");
curl_exec($curl);
curl_error($curl);
$res=Db::table('wd_user')->where(array('user_id'=>$s_id))->field('qrcode')->find();
return json(['code'=>200,'url'=>$res]);
}
public function uploadtooss()
{
$file=$this->request->file();
$user_id=$this->request->post();
$alioss = new Alioss();
$arr = $alioss->uploadFile($file['file']);
//将二维码地址保存在数据库中
Db::table('wd_user')->where(array('user_id'=>$user_id['user_id']))->update(array('qrcode'=> $arr['address:']));
}
}