目录功能说明设计思路功能流程图数据表代码说明常见问题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.php3. 功能流程图文件上传流程┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ 选择文件 │ -- │ 文件验证 │ -- │ 选择存储 │ -- │ 执行上传 │ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ │ v ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ 返回URL │ -- │ 记录附件 │ -- │ 存储文件 │ -- │ 生成路径 │ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘详细步骤说明选择文件前端选择要上传的文件支持拖拽上传和点击选择文件验证验证文件类型是否允许验证文件大小是否超限验证文件是否合法选择存储方式根据配置选择默认存储支持指定存储方式执行上传生成存储路径和文件名调用存储驱动上传文件存储文件本地存储保存到服务器磁盘云存储上传到云服务商记录附件保存附件信息到数据库生成访问URL返回结果返回文件URL和附件ID4. 数据表附件表 (sys_attachment)索引说明PRIMARY KEY(att_id)KEYidx_cate_id(cate_id)KEYidx_type(att_type)附件分组表 (sys_attachment_category)字段名类型长度是否为空默认值说明idint11否自增分组ID主键namevarchar50否-分组名称pidint11否0父分组IDsortint11否0排序create_timedatetime-否CURRENT_TIMESTAMP创建时间索引说明PRIMARY KEY(id)KEYidx_pid(pid)5. 代码说明5.1 接口定义图片上传接口项目说明接口地址/sys/image请求方式POSTContent-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: 上传失败提示文件类型不允许问题现象上传文件时返回错误提示文件类型不被允许。原因分析文件扩展名不在允许列表中文件MIME类型检测失败文件头信息不完整解决方案检查文件扩展名是否在配置允许列表确认文件未损坏且格式正确检查上传配置中的文件类型限制预防措施前端提前校验文件类型提供清晰的文件类型提示定期更新允许的文件类型列表Q2: 大文件上传超时问题现象上传大文件时请求超时或上传失败。原因分析PHP上传大小限制请求超时时间设置过短服务器内存不足解决方案修改php.ini配置iniupload_max_filesize 100M post_max_size 100M max_execution_time 300使用分片上传功能增加服务器内存限制预防措施前端显示上传进度大文件自动启用分片上传合理设置文件大小限制Q3: 云存储配置后无法上传问题现象配置云存储后上传文件报错或失败。原因分析云存储密钥配置错误存储桶权限设置不正确网络连接问题解决方案检查AccessKey和SecretKey是否正确确认存储桶读写权限已开启测试与云服务商的网络连通性查看云服务商控制台是否有相关错误日志预防措施配置后提供测试连接功能定期检查存储配置有效性设置配置错误告警Q4: 附件删除后文件仍然存在问题现象删除附件记录后存储中的文件没有被删除。原因分析删除逻辑只删除了数据库记录文件权限不足无法删除文件被其他记录引用解决方案检查删除逻辑是否包含文件删除操作确认服务器对存储目录有删除权限实现文件引用计数无引用时才删除预防措施定期清理无效文件实现文件引用计数机制提供手动清理工具修订记录版本日期修订人修订内容v1.02024-01-01-初始版本v2.02024-04-02-按照开发手册规范重构文档结构
阅读完成 · 觉得有帮助?