fastadmin 文件上传七牛云

1-安装七牛云官方SDK

composer require qiniu/php-sdk

2-七牛云配置

<?phpnamespace app\common\controller;use Qiniu\Storage\BucketManager;
use think\Config;
use Qiniu\Auth;
use Qiniu\Storage\UploadManager;
use think\Controller;
use think\Db;/*** 七牛基类*/
class Qiniu extends Controller
{/** * 上传* @param array $file 图片参数* @return array*/public function uploadOne($config){$data = $this->request->file();$info = $data['file']->getInfo();$domain = $config['qiniu_domain'];$bucket = $config['qiniu_bucket'];$auth = new Auth($config['qiniu_accesskey'], $config['qiniu_secretkey']);// 生成上传Token$token = $auth->uploadToken($bucket);$parts = explode('.', $info['name']);$extension = end($parts);$filename=hash('md5', uniqid()).mt_rand(1,99).'.'.$extension;// 构建 UploadManager 对象$uploadMgr = new UploadManager();list($ret, $err) = $uploadMgr->putFile($token, 'uploads/'.$filename, $info['tmp_name']);if ($err !== null) {return ['code' => 0,  'msg' => '上传失败'];} else {//返回图片的完整URLDb::name('attachment')->insert(['filesize'    => $info['size'],'imagetype'   => $info['type'],'imageframes' => 0,'mimetype'    => $info['type'],'filename'    => $filename,'url'         => $ret['key'],'createtime'  => time(),'updatetime'  => time(),'uploadtime'  => time(),'storage'     => 'qiniu','sha1'        => '','type'        => 2,'type_url'    => $domain,'extparam'    => '',]);return ['code' => 1, 'msg' => '上传完成', 'data' => ($domain . $ret['key'])];}}public function deleteOne($imageName,$config){// 构建认证$auth = new Auth($config['qiniu_accesskey'], $config['qiniu_secretkey']);// 构建请求$bucketMgr = new BucketManager($auth);// 要删除的文件的名称,包括你设置的前缀$key = $imageName;// 要删除文件的空间$bucket = $config['qiniu_bucket'];list($ret, $err) = $bucketMgr->delete($bucket, $key);if ($err !== null) {// 处理错误Checking::writeLog($err->message(),'删除失败','qiniu.log');} else {// 删除成功Checking::writeLog('删除成功','ok','qiniu.log');}}
}

 接下来修改fastadmin 上传文件  api/controller/Common.php 文件下的 upload 方法

<?phpnamespace app\api\controller;use app\common\controller\Api;
use app\common\exception\UploadException;
use app\common\library\Upload;
use app\common\model\Area;
use app\common\model\Version;
use fast\Random;
use think\captcha\Captcha;
use think\Config;
use think\Db;
use think\Hook;/*** 公共接口*/
class Common extends Api
{protected $noNeedLogin = ['init', 'captcha','upload'];protected $noNeedRight = '*';protected $config;public function _initialize(){if (isset($_SERVER['HTTP_ORIGIN'])) {header('Access-Control-Expose-Headers: __token__');//跨域让客户端获取到}//跨域检测check_cors_request();if (!isset($_COOKIE['PHPSESSID'])) {Config::set('session.id', $this->request->server("HTTP_SID"));}parent::_initialize();$this->config=Db::name('config')->where(['group'=>'attachment'])->column('value','name');}/*** 加载初始化** @param string $version 版本号* @param string $lng 经度* @param string $lat 纬度*/public function init(){if ($version = $this->request->request('version')) {$lng = $this->request->request('lng');$lat = $this->request->request('lat');//配置信息$upload = Config::get('upload');//如果非服务端中转模式需要修改为中转if ($upload['storage'] != 'local' && isset($upload['uploadmode']) && $upload['uploadmode'] != 'server') {//临时修改上传模式为服务端中转set_addon_config($upload['storage'], ["uploadmode" => "server"], false);$upload = \app\common\model\Config::upload();// 上传信息配置后Hook::listen("upload_config_init", $upload);$upload = Config::set('upload', array_merge(Config::get('upload'), $upload));}$upload['cdnurl'] = $upload['cdnurl'] ? $upload['cdnurl'] : cdnurl('', true);$upload['uploadurl'] = preg_match("/^((?:[a-z]+:)?\/\/)(.*)/i", $upload['uploadurl']) ? $upload['uploadurl'] : url($upload['storage'] == 'local' ? '/api/common/upload' : $upload['uploadurl'], '', false, true);$content = ['citydata'    => Area::getCityFromLngLat($lng, $lat),'versiondata' => Version::check($version),'uploaddata'  => $upload,'coverdata'   => Config::get("cover"),];$this->success('', $content);} else {$this->error(__('Invalid parameters'));}}/*** 上传文件* @ApiMethod (POST)* @param File $file 文件流*/public function upload(){Config::set('default_return_type', 'json');//必须设定cdnurl为空,否则cdnurl函数计算错误Config::set('upload.cdnurl', '');$chunkid = $this->request->post("chunkid");if ($chunkid) {if (!Config::get('upload.chunking')) {$this->error(__('Chunk file disabled'));}$action = $this->request->post("action");$chunkindex = $this->request->post("chunkindex/d");$chunkcount = $this->request->post("chunkcount/d");$filename = $this->request->post("filename");$method = $this->request->method(true);if ($action == 'merge') {$attachment = null;//合并分片文件try {$upload = new Upload();$attachment = $upload->merge($chunkid, $chunkcount, $filename);} catch (UploadException $e) {$this->error($e->getMessage());}$this->success(__('Uploaded successful'), ['url' => $attachment->url, 'fullurl' => cdnurl($attachment->url, true)]);} elseif ($method == 'clean') {//删除冗余的分片文件try {$upload = new Upload();$upload->clean($chunkid);} catch (UploadException $e) {$this->error($e->getMessage());}$this->success();} else {//上传分片文件//默认普通上传文件$file = $this->request->file('file');try {$upload = new Upload($file);$upload->chunk($chunkid, $chunkindex, $chunkcount);} catch (UploadException $e) {$this->error($e->getMessage());}$this->success();}} else {switch ($this->config['attachment_type']){case 2:$qiniu = new \app\common\controller\Qiniu;$attachment = $qiniu->uploadOne($this->config);if ($attachment["code"] == 0) {$this->error($attachment["msg"]);}$this->success(__('Uploaded successful'), '', ['url' => $attachment['data'], 'fullurl' => cdnurl($attachment['data'], true)]);break;case 3:$tencent= new \app\common\controller\Tencent;$attachment = $tencent->uploadToTencentCloud($this->config);if ($attachment["code"] == 0) {$this->error($attachment["msg"]);}$this->success(__('Uploaded successful'), '', ['url' => $attachment['data'], 'fullurl' => cdnurl($attachment['data'], true)]);break;case 4:break;default://默认普通上传文件$attachment = null;//默认普通上传文件$file = $this->request->file('file');try {$upload = new Upload($file);$attachment = $upload->upload();} catch (UploadException $e) {$this->error($e->getMessage());}$this->success(__('Uploaded successful'), '', ['url' => $attachment->url, 'fullurl' => cdnurl($attachment->url, true)]);break;}
//            $attachment = null;
//            //默认普通上传文件
//            $file = $this->request->file('file');
//            try {
//                $upload = new Upload($file);
//                $attachment = $upload->upload();
//            } catch (UploadException $e) {
//                $this->error($e->getMessage());
//            } catch (\Exception $e) {
//                $this->error($e->getMessage());
//            }
//
//            $this->success(__('Uploaded successful'), ['url' => $attachment->url, 'fullurl' => cdnurl($attachment->url, true)]);}}/*** 验证码* @param $id* @return \think\Response*/public function captcha($id = ""){\think\Config::set(['captcha' => array_merge(config('captcha'), ['fontSize' => 44,'imageH'   => 150,'imageW'   => 350,])]);$captcha = new Captcha((array)Config::get('captcha'));return $captcha->entry($id);}
}

接下来修改附件选择器 admin/controller/general/Attachment.php 下的index方法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/878943.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【leetcode刷题之路】面试经典hot100(2)——普通数组+矩阵+链表

文章目录 5 普通数组5.1 【动态规划】最大子数组和5.2 【排序】合并区间5.3 【数组】轮转数组5.4 【前缀和】除自身以外数组的乘积5.5 【哈希表】缺失的第一个正数 6 矩阵6.1 【哈希表】矩阵置零6.2 【模拟】螺旋矩阵6.3 【模拟】旋转图像6.4 【分治】搜索二维矩阵 II 7 链表7.…

Go语言结构体和元组全面解析

Go语言中的复合类型与其应用 在编程中&#xff0c;标准类型虽然方便&#xff0c;但无法满足所有需求。Go通过支持结构体和元组类型&#xff0c;为开发者提供了自定义数据类型的能力。本文将介绍如何定义结构体、如何使用指针操作结构体、如何通过元组返回多个值等内容&#xf…

CTK框架(四): 插件编写

目录 1.生成插件 1.1.环境说明 1.2.服务类&#xff0c;纯虚类&#xff0c;提供接口 1.3.实现插件类&#xff0c;实现纯虚函数 1.4.激活插件&#xff0c;加入ctk框架的生命周期中 1.5.添加资源文件 1.6..pro文件 2.使用此插件 3.总结 1.生成插件 1.1.环境说明 编译ct…

如何将卷积神经网络(CNN)应用于医学图像分析:从分类到分割和检测的实用指南

引言 在现代医疗领域,医学图像已经成为疾病诊断和治疗规划的重要工具。医学图像的类型繁多,包括但不限于X射线、CT(计算机断层扫描)、MRI(磁共振成像)和超声图像。这些图像提供了对身体内部结构的详细视图,有助于医生在进行准确诊断和制定个性化治疗方案时获取关键的信…

[数据结构] 哈希结构的哈希冲突解决哈希冲突

标题&#xff1a;[C] 哈希结构的哈希冲突 && 解决哈希冲突 水墨不写bug 目录 一、引言 1.哈希 2.哈希冲突 3.哈希函数 二、解决哈希冲突 1.闭散列 I&#xff0c;线性探测 II&#xff0c;二次探测 2.开散列 正文开始&#xff1a; 一、引言 哈希表是一种非常实用而…

JS基础学习笔记

1.引入方式 内部脚本 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> <…

Nginx跨域运行案例:云台控制http请求,通过 http server 代理转发功能,实现跨域运行。(基于大华摄像头WEB无插件开发包)

文章目录 引言I 跨域运行案例开发资源测试/生产环境,Nginx代理转发,实现跨域运行本机开发运行II nginx的location指令Nginx配置中, 获取自定义请求header头Nginx 配置中,获取URL参数引言 背景:全景监控 需求:感知站点由于云台相关操作为 http 请求,http 请求受浏览器…

抢鲜体验 PolarDB PG 15 开源版

unsetunsetPolarDB 商业版unsetunset 8 月&#xff0c;PolarDB PostgreSQL 版兼容 PostgreSQL 15 版本&#xff08;商业版&#xff09;正式发布上线。 当前版本主要增强优化了以下方面&#xff1a; 改进排序功能&#xff1a;改进内存和磁盘排序算法。 增强SQL功能&#xff1a;支…

C++笔试强训12、13、14

文章目录 笔试强训12一、选择题1-5题6-10题 二、编程题题目一题目二 笔试强训13一、选择题1-5题6-10题 二、编程题题目一题目二 笔试强训14一、选择题1-5题6-10题 二、编程题题目一题目二 笔试强训12 一、选择题 1-5题 引用&#xff1a;是一个别名&#xff0c;与其被引用的实…

ArcGIS Pro SDK (十三)地图创作 1 地图

ArcGIS Pro SDK (十三)地图创作 1 地图 文章目录 ArcGIS Pro SDK (十三)地图创作 1 地图1 地图1.1 获取活动地图1.2 使用默认底图图层创建新地图1.3 在工程中查找地图并将其打开1.4 打开 web 地图1.5 获取地图窗格1.6 从地图窗格中获取唯一的地图列表1.7 更改地图名称1.8 重…

计算机网络(二) —— 网络编程套接字

目录 一&#xff0c;认识端口号 1.1 背景 1.2 端口号是什么 1.3 三个问题 二&#xff0c;认识Tcp协议和Udp协议 三&#xff0c;网络字节序 四&#xff0c;socket编程接口 4.1 socket常见API 4.2 sockaddr结构 一&#xff0c;认识端口号 1.1 背景 问题&#xff1a;在进…

vue2-elementUI-初始化启动项目-git

前置基础 资料下载-阿里云盘 vueaxioselement-uinpmvscode 初始化项目 1.创建vue2工程 1.1 vue create projectName1.2 选择 1.3 初始化 vue-cli 的核心步骤&#xff1a; Manually select features (*) Babel ( ) TypeScript ( ) Progressive Web App (PWA) Support …

【H2O2|全栈】关于HTML(4)HTML基础(三)

HTML相关知识 目录 HTML相关知识 前言 准备工作 标签的具体分类&#xff08;三&#xff09; 本文中的标签在什么位置中使用&#xff1f; 列表 ​编辑​编辑 有序列表 无序列表 自定义列表 表格 拓展案例 预告和回顾 后话 前言 本系列博客将分享HTML相关知识点…

mysql学习教程,从入门到精通,MySQL 删除数据库教程(6)

1、MySQL 删除数据库 使用普通用户登陆 MySQL 服务器&#xff0c;你可能需要特定的权限来创建或者删除 MySQL 数据库&#xff0c;所以我们这边使用 root 用户登录&#xff0c;root 用户拥有最高权限。 在删除数据库过程中&#xff0c;务必要十分谨慎&#xff0c;因为在执行删除…

【 html+css 绚丽Loading 】000044 两仪穿行轮

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享htmlcss 绚丽Loading&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495…

4-1.Android Camera 之 CameraInfo 编码模板(前后置摄像头理解、摄像头图像的自然方向理解)

一、Camera.CameraInfo Camera.CameraInfo 是用于获取设备上摄像头信息的一个类&#xff0c;它提供摄像头的各种详细信息&#xff0c;例如&#xff0c;摄像头的方向、是否支持闪光灯等&#xff0c;以下是它的常用属性 static int CAMERA_FACING_BACK&#xff1a;表示设备的后置…

malloc中的mmap是如何分配内存的

mmap 的内存分配过程 虚拟内存的分配&#xff1a;当调用 mmap 分配匿名内存时&#xff0c;系统在进程的虚拟地址空间中为请求的内存区域创建一块地址空间。此时并不会立即为该区域分配物理内存&#xff0c;而是仅仅在虚拟地址空间中预留了空间。 页面分配&#xff1a;当进程第…

云计算之数据库

目录 一、RDS产品介绍及排障思路 1.1 云RDS数据库及其特点 1.2 云RDS数据库-规格 1.3 云RDS数据库-存储 ​1.4 云RDS数据库-安全 ​1.5 云RDS数据库-整体架构 1.6 RDS常见问题排查 ​1.6.1 如何解决无法链接RDS实例的问题 1.6.2 RDS实例存储空间使用率高&#xff0c;怎…

机器学习引领未来:赋能精准高效的图像识别技术革新

图像识别技术近年来取得了显著进展,深刻地改变了各行各业。机器学习,特别是深度学习的突破,推动了这一领域的技术革新。本文将深入探讨机器学习如何赋能图像识别技术,从基础理论到前沿进展,再到实际应用与挑战展望,为您全面呈现这一领域的最新动态和未来趋势。 1. 引言 …

计算机网络与Internet应用

一、计算机网络 1.计算机网络的定义 网络定义&#xff1a;计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备&#xff0c;通过通信线路连接起来&#xff0c;在网络操作系统&#xff0c;网络管理软件及网络通信协议的管理和协调下&#xff0c;实现资源共享…