news 2026/10/23 6:32:48

NIUCLOUD LITE AI开发文档—模块开发:云储存上传

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
NIUCLOUD LITE AI开发文档—模块开发:云储存上传

目录​

  • 功能说明
  • 设计思路
  • 功能流程图
  • 数据表
  • 代码说明
  • 常见问题

1. 功能说明​

概述​

云储存上传模块负责系统中所有文件的上传和管理功能,支持多种存储方式,提供统一的文件上传接口和管理能力。

适用场景​

  • 用户头像上传
  • 商品图片上传
  • 视频文件存储
  • 文档文件管理
  • 富文本编辑器图片上传

功能特点​

  • 多存储方式支持:本地存储、阿里云OSS、腾讯云COS、七牛云存储
  • 文件类型支持:图片、视频、音频、文档等多种类型
  • 附件分组管理:支持创建分组、移动附件
  • 存储配置灵活:可配置默认存储方式

2. 设计思路​

设计理念​

采用"统一接口、多存储适配"的设计理念,通过抽象上传接口,实现不同存储方式的无缝切换。

技术选型​

架构设计​

系统采用分层架构设计:

  • 接口层:Controller接收上传请求
  • 服务层:Service处理业务逻辑
  • 核心层:CoreUpload处理上传逻辑
  • 存储层:不同存储方式的具体实现
  • 数据层:附件信息持久化

模块划分​

upload/ ├── controller/ # 控制器层 │ ├── Upload.php # 上传控制器 │ └── Sys.php # 系统配置控制器 ├── service/ # 业务逻辑层 │ ├── UploadService.php │ └── CoreUploadService.php ├── core/ # 核心上传层 │ ├── BaseUpload.php │ ├── Local.php │ ├── Aliyun.php │ ├── Tencent.php │ ├── Qiniu.php │ └── UploadLoader.php └── model/ # 数据模型层 ├── Attachment.php └── AttachmentCategory.php

3. 功能流程图​

文件上传流程​

┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ 选择文件 │ --> │ 文件验证 │ --> │ 选择存储 │ --> │ 执行上传 │ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ │ v ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ 返回URL │ <-- │ 记录附件 │ <-- │ 存储文件 │ <-- │ 生成路径 │ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘

详细步骤说明​

  1. 选择文件

    • 前端选择要上传的文件
    • 支持拖拽上传和点击选择
  2. 文件验证

    • 验证文件类型是否允许
    • 验证文件大小是否超限
    • 验证文件是否合法
  3. 选择存储方式

    • 根据配置选择默认存储
    • 支持指定存储方式
  4. 执行上传

    • 生成存储路径和文件名
    • 调用存储驱动上传文件
  5. 存储文件

    • 本地存储:保存到服务器磁盘
    • 云存储:上传到云服务商
  6. 记录附件

    • 保存附件信息到数据库
    • 生成访问URL
  7. 返回结果

    • 返回文件URL和附件ID

4. 数据表​

附件表 (sys_attachment)​

索引说明​
  • PRIMARY KEY(att_id)
  • KEYidx_cate_id(cate_id)
  • KEYidx_type(att_type)

附件分组表 (sys_attachment_category)​

字段名类型长度是否为空默认值说明
idint11否自增分组ID,主键
namevarchar50否-分组名称
pidint11否0父分组ID
sortint11否0排序
create_timedatetime-否CURRENT_TIMESTAMP创建时间
索引说明​
  • PRIMARY KEY(id)
  • KEYidx_pid(pid)

5. 代码说明​

5.1 接口定义​

图片上传接口​
项目说明
接口地址/sys/image
请求方式POST
Content-Typemultipart/form-data

请求参数:

参数名类型是否必填说明
filefile是图片文件
cate_idint否分组ID

响应示例:

{ "code": 200, "message": "上传成功", "data": { "url": "https://xxx.com/upload/image/202401/01/xxx.jpg", "att_id": 10001 } }

5.2 核心代码​

上传服务​
/** * 图片上传 * @param $file 上传的文件 * @param int $cate_id 分组ID * @param bool $is_attachment 是否记录附件 * @return array */ public function image($file, int $cate_id = 0, $is_attachment = true) { $dir = $this->root_path . '/' . 'image' . '/' . date('Ym') . '/' . date('d'); $core_upload_service = new CoreUploadService($is_attachment); return $core_upload_service->image($file, $dir, $cate_id); }
核心上传处理​
/** * 上传后处理 * @param string $file_dir 文件目录 * @param string $type 文件类型 * @param int $cate_id 分组ID * @return array */ public function after(string $file_dir, string $type, int $cate_id = 0) { $file_info = $this->upload_driver->getFileInfo(); $dir = $this->root_path . '/' . $file_dir; // 执行上传 $this->upload_driver->setType($type)->setValidate($this->validate)->upload($dir); $file_name = $this->upload_driver->getFileName(); $full_path = $this->upload_driver->getFullPath($dir); $url = $this->upload_driver->getUrl($full_path); if ($this->is_attachment) { // 记录附件信息 $data = [ 'name' => $file_name, 'dir' => $dir, 'att_type' => $type, 'real_name' => $file_info['name'], 'att_size' => $file_info['size'], 'storage_type' => self::$storage_type, 'path' => $full_path, 'url' => $url, 'cate_id' => $cate_id, ]; $att_id = (new CoreAttachmentService())->add($data); } return [ 'url' => $url, 'att_id' => $att_id ?? 0 ]; }

5.3 配置说明​

// config/storage.php return [ // 默认存储方式 'default' => 'local', // 本地存储配置 'local' => [ 'driver' => 'local', 'root' => root_path() . 'public/upload', 'url' => '/upload', ], // 阿里云OSS配置 'aliyun' => [ 'driver' => 'aliyun', 'access_key' => env('ALIYUN_ACCESS_KEY'), 'secret_key' => env('ALIYUN_SECRET_KEY'), 'bucket' => env('ALIYUN_BUCKET'), 'endpoint' => env('ALIYUN_ENDPOINT'), ], // 腾讯云COS配置 'tencent' => [ 'driver' => 'tencent', 'secret_id' => env('TENCENT_SECRET_ID'), 'secret_key' => env('TENCENT_SECRET_KEY'), 'bucket' => env('TENCENT_BUCKET'), 'region' => env('TENCENT_REGION'), ], ];

6. 常见问题​

Q1: 上传失败,提示"文件类型不允许"​

问题现象:上传文件时返回错误,提示文件类型不被允许。

原因分析:

  1. 文件扩展名不在允许列表中
  2. 文件MIME类型检测失败
  3. 文件头信息不完整

解决方案:

  1. 检查文件扩展名是否在配置允许列表
  2. 确认文件未损坏且格式正确
  3. 检查上传配置中的文件类型限制

预防措施:

  • 前端提前校验文件类型
  • 提供清晰的文件类型提示
  • 定期更新允许的文件类型列表

Q2: 大文件上传超时​

问题现象:上传大文件时,请求超时或上传失败。

原因分析:

  1. PHP上传大小限制
  2. 请求超时时间设置过短
  3. 服务器内存不足

解决方案:

  1. 修改php.ini配置:ini
    upload_max_filesize = 100M post_max_size = 100M max_execution_time = 300
  2. 使用分片上传功能
  3. 增加服务器内存限制

预防措施:

  • 前端显示上传进度
  • 大文件自动启用分片上传
  • 合理设置文件大小限制

Q3: 云存储配置后无法上传​

问题现象:配置云存储后,上传文件报错或失败。

原因分析:

  1. 云存储密钥配置错误
  2. 存储桶权限设置不正确
  3. 网络连接问题

解决方案:

  1. 检查AccessKey和SecretKey是否正确
  2. 确认存储桶读写权限已开启
  3. 测试与云服务商的网络连通性
  4. 查看云服务商控制台是否有相关错误日志

预防措施:

  • 配置后提供测试连接功能
  • 定期检查存储配置有效性
  • 设置配置错误告警

Q4: 附件删除后文件仍然存在​

问题现象:删除附件记录后,存储中的文件没有被删除。

原因分析:

  1. 删除逻辑只删除了数据库记录
  2. 文件权限不足无法删除
  3. 文件被其他记录引用

解决方案:

  1. 检查删除逻辑是否包含文件删除操作
  2. 确认服务器对存储目录有删除权限
  3. 实现文件引用计数,无引用时才删除

预防措施:

  • 定期清理无效文件
  • 实现文件引用计数机制
  • 提供手动清理工具

修订记录​

版本日期修订人修订内容
v1.02024-01-01-初始版本
v2.02024-04-02-按照开发手册规范重构文档结构
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/23 6:32:40

【STM32标准库】铁头山羊--[EXTI]工作原理(笔记)

一.EXTI模块简介EXTI模块也是单片机上的片上外设GPIO模块和EXTI模块的关系EXTI检测是电压的变化(上升沿和下降沿)&#xff0c;不检测电压的高低当电压发生变化时会被EXTI模块捕捉——>EXTI模块向外产生中断&#xff08;中断中有对输入信号的处理函数&#xff09;总结&#x…

作者头像 李华
网站建设 2026/10/23 6:30:22

K8s上部署Hadoop集群:StatefulSet与持久化存储实践指南

这已经是我服务器搭建系列的第十五篇了。前面咱们把基础容器环境、持久化存储、监控告警和常用中间件都铺了一遍&#xff0c;这次来啃一块硬骨头&#xff1a;在 k8s 上部署一套 Hadoop 集群&#xff0c;而且直接用 2022 年的最新稳定版本。很多朋友学完 k8s 基础之后&#xff0…

作者头像 李华
网站建设 2026/10/23 6:30:08

黑客松强调“短时间验证创意”,BuilderX 2026 黑客松大赛也设置了智能硬件、Agent 智能体赋能等赛道

黑客松强调“短时间验证创意”&#xff0c;BuilderX 2026 黑客松大赛也设置了智能硬件、Agent 智能体赋能等赛道&#xff0c;参赛团队需要在有限时间内完成原型搭建、数据展示和成果汇报。在这种高强度场景下&#xff0c;一份能够自动生成的项目报告&#xff0c;往往比临时拼凑…

作者头像 李华
网站建设 2026/10/23 6:29:53

Linux内核bzImage构建原理与实战:从压缩到可启动镜像

1. 项目概述&#xff1a;从源码到可启动镜像的完整闭环“linux内核压缩制作bzImage”——这八个字背后&#xff0c;不是一条命令就能走完的捷径&#xff0c;而是一整套贯穿编译原理、内存布局、引导协议与硬件交互的底层工程实践。我第一次在某嵌入式实验室调试一块ARM64开发板…

作者头像 李华
网站建设 2026/10/23 6:28:45

如何写 Skill 第7课,子 agent 派工:买的是干净,不是人手

摘要&#xff1a;skill 里的活不必都由主对话自己干&#xff1a;产出大或脏、能自足收工的活可以派给子代理&#xff0c;它带着全新上下文干活&#xff0c;主对话只收结论。派工不是雇人手&#xff0c;是买干净&#xff0c;付 token&#xff0c;买隔离。本文用四问把这笔交易算…

作者头像 李华
网站建设 2026/10/23 6:26:20

PPA1510 功率分析仪:两台一起测怎么协同

Newtons4th 的 PPA1510 是一台功率分析仪。单台测功率没什么特别&#xff0c;但这台设备有个不太常见的能力——它自己就知道怎么跟另一台配合。驱动里的示例把这个用法专门做成了一个例子。为什么需要两台单台功率分析仪能测的通道数是有限的。当被测对象有多个端口——比如三…

作者头像 李华