- 背景
最近在学习大佬的教程时,遇到七牛云图片上传的操作;
发现若是有后期在线网站的开发需求,可以考虑选取;
主要是很多网站在使用,可作为学习的小技能;
在此做下记录,方便同样需求的小伙伴以作参考,同时也是自己的备忘经验,欢迎指摘 …
【七牛云官方网站
】
【PHP SDK 开发文档
】
> 本人使用的框架为:ThinkPHP5.0.24
> 其实,可以直接阅读官方文档,自行对照开发即可,后面的也只是我们的实际操作而已
▼ 前期准备
①. 开通七牛开发者帐号
②. 如果已有账号,点击【秘钥管理】查看 Access Key 和 Secret Key
③. 到 “对象存储” 新建一个存储空间 (公开空间),并记下 名称
④. 运行 Composer
命令安装最新稳定版本的 SDK
php composer.phar require qiniu/php-sdk
或: composer require qiniu/php-sdk
▼ 开发步骤
①. 在 application/extra
中新建配置文件 qiniui.php
return [
'ak' => 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxx',//Access_Key
'sk' => 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',//Secret_Key
'bucket' => 'mz-7img',//空间名称
'image_url' => 'xxxxxx.xxx.clouddn.com/',//外链域名
];
②. 在目录 /application/common/lib
下,创建 Upload.php
类,源代码如下:
<?php
/**
* Created by PhpStorm.
* User: moTzxx
* Date: 2020/4/11
* Time: 12:20
*/
namespace app\common\lib;
// 引入七牛鉴权类
use Qiniu\Auth;
use Qiniu\Config;
use Qiniu\Storage\BucketManager;
use Qiniu\Storage\UploadManager;
/**
* 七牛云图片上传基础类库
* Class Upload
* @package app\common\lib
*/
class Upload
{
/**
* 七牛云图片上传操作
* @return bool|string
*/
public static function imageQiNiu(){
// 要上传文件的临时文件
$file = $_FILES['file']['tmp_name'];
if (empty($file)){
$message = "您提交的图片数据不合法";
return false;
}else{
//拿到上传文件的格式
$pathinfo = pathinfo($_FILES['file']['name']);
//获取图片后缀名
$ext = $pathinfo['extension'];
$config = config('qiniu');
//构建一个鉴权对象
$auth = new Auth($config['ak'],$config['sk']);
//生成上传的token
$token = $auth->uploadToken($config['bucket']);
//上传到七牛云后 保存的文件名
$saveFileName = date("YmdHis").substr(md5($file),0,6).rand(0000,9999).".".$ext;
//初始化UploadManager类
$uploadMgr = new UploadManager();
$opRes = $uploadMgr->putFile($token,$saveFileName,$file);
if ($opRes[1] != null){
return false;
}else{
return $saveFileName;
}
}
}
/**
* 七牛云图片删除操作
* @param $delFileName 七牛云图片名称,例:2020041208595410935c8386.jpg
* @return bool
*/
public static function delImgQiNiu($delFileName)
{
// 判断是否是图片
$isImage = preg_match('/.*(\.png|\.jpg|\.jpeg|\.gif)$/', $delFileName);
if(!$isImage){
return false;
}else{
//七牛云账号配置信息
$conf = config('qiniu');
// 构建鉴权对象
$auth = new Auth($conf['ak'],$conf['sk']);
// 配置
$config = new Config();
// 管理资源
$bucketManager = new BucketManager($auth, $config);
// 删除文件操作
$opRes = $bucketManager->delete($conf['bucket'], $delFileName);
if (is_null($opRes)) {
// 删除操作成功
return true;
}else{
return false;
}
}
}
}
③. 图片上传控件,点击操作进行 ajax
请求,则后台服务端处理逻辑参考如下:
public function uploadQiNiu(Request $request){
$status = 0;
$data = [];
if ($request->Method()== 'POST') {
$image = Upload::imageQiNiu();
if ($image){
$status = 1;
$data['url'] = config('qiniu.image_url').$image;
$message = '上传成功';
}else{
$message = '上传失败';
}
}else{
$message = "参数错误";
}
return showMsg($status, $message,$data);
}
- 后面就是针对自己的业务逻辑,自行优化代码了 …
附录:
- 补充一个,直接从服务端将 docx 文件上传难道 七牛云服务器的封装方法
【Upload::qiNiuForServerSingleFile()
】
场景:自己的服务器对比较大的文件下载,太影响下载速度,所以提交到七牛云 (
代码简要测试,可优化使用
)
/**
* 服务端文件,上传到七牛云服务器
* @param string $file_name 文件名称(无扩展名后缀)
* @param string $file_from_path 服务端所需上传文件的绝对地址 参考: app()->getRootPath().'public'.$word_file_url;
* @param string $file_to_path 七牛云服务器中,要存储的目录 例:'task_words/'.$task_idstr??'';
* @param string $ext_name 文件扩展名: txt 、docx
* @return mixed|string
* @throws \Exception
*/
public static function qiNiuForServerSingleFile($file_name = '',$file_from_path = '',$file_to_path = '',$ext_name = 'txt'){
$config = config('qiniu.');
//构建一个鉴权对象
$auth = new Auth($config['AK'],$config['SK']);
//生成上传的token
$token = $auth->uploadToken($config['BUCKET']);
// 构建 UploadManager 对象
$uploadMgr = new UploadManager();
// 上传文件到七牛
if (empty($file_name)){
$file_name = md5(uniqid(microtime(true),true));
}
if (empty($file_to_path)){}
$qiNiu_saveFileName = $file_to_path.'/'.$file_name.'.'.$ext_name;
$opRes = $uploadMgr->putFile($token, $qiNiu_saveFileName, $file_from_path);
if ($opRes[1] !== null) {
//上传失败
trace(json_encode(['title' => '上传七牛云失败', 'data' => $opRes[1]], JSON_UNESCAPED_UNICODE), 'error');
return '';
} else {
//删除临时服务器txt文件
unlink($file_from_path);
return $qiNiu_saveFileName;
}
}