[TOC]
### 基于egg 封装公共上传类
1. 配置上传路径 config.default.js
```
// 上传文件类型限制
config.multipart = {
fileExtensions: [ '.apk' ] // 增加对 apk 扩展名的文件支持
}
// add your user config here
const userConfig = {
// 上传路径配置
upload_path: 'app/public/admin/uploads'
};
```
2.导入上传类
app / service / uploads.js
```
'use strict';
const Service = require('egg').Service;
// 日期格式化插件
const sd = require('silly-datetime')
const path = require('path')
const fs = require('fs')
// 创建文件夹模块
const mkdirp = require('mz-modules/mkdirp')
const pump = require('mz-modules/pump')
/**
* 公共文件上传类
* 安装 silly-datetime 日期格式化插件 文档:https://www.npmjs.com/package/silly-datetime
* 安装 mz-modules 模块 需要里面的 mkdirp 递归创建目录
*/
class UploadService extends Service {
/**
* Public
* 上传文件 支持多文件 单文件上传
* @return { files: 数据库保存的上传路径 fields: POST 提交的表单字段 }
*/
async uploadMoreAndSingle() {
const { ctx } = this
// 获取多个文件提交的数据流,多文件上传专用
let parts = ctx.multipart({ autoFields: true })
// let files = [] // 数组形式
let files = {} // 对象形式
let stream
while ((stream = await parts()) != null) {
// 判断用户是否选择上传图片
if (!stream.filename) {
ctx.throw('请选择上传的图片!')
return
}
// filename 获取上传的文件名 xxx.jpg
let filename = stream.filename.toLowerCase()
// fieldname 获取文件表单提交的字段名称
let fieldname = stream.fieldname
// 拼接上传路径
let dir = await this._getUploadDir(filename)
let target = dir.uploadDir
// 创建可写流
let writeStream = fs.createWriteStream(target)
// 读取文件 && 写入 && 销毁当前流
await pump(stream, writeStream)
// 对象形式
files = Object.assign(files, {
[fieldname]: dir.saveDir
})
// 数组形式
// files.push({
// [fieldname]: dir.saveDir
// })
}
return {
// 数据库保存的上传路径
files,
// 提交的表单字段
fields: parts.field
}
}
/**
* Private
* 返回上传路径
* @filename 当前 POST 表单获取的文件流
* @return { uploadDir 上传保存的硬路径 saveDir 数据库保存的路径 }
*/
async _getUploadDir(filename) {
// 获取当前日期
const today = sd.format(new Date(), 'YYYYMMDD')
// 拼接上传地址 当前时间 + 上传目录
const upload_dir = path.join(this.config.upload_path, today)
// 创建文件夹 目录不存在则创建
await mkdirp(upload_dir)
// 以当前时间戳 毫秒数 作为文件名保存
const d = (new Date()).getTime()
// 返回图片保存路径 app\public\admin\uploads\20190712\1562946142820.jpg
const file_dir = path.join(upload_dir, `${d}${path.extname(filename)}`)
return {
uploadDir: file_dir,
// 数据库保存地址 正则可以一次替换多个路径
saveDir: file_dir.slice(3).replace(/\\/g, '/')
}
}
}
module.exports = UploadService;
```
- 概述
- 起步
- 跨域配置
- 路径别名
- 路由
- api版本控制
- 错误和异常
- 全局异常处理
- 数据库
- 创建迁移文件
- sequelize数据类型
- 配置
- 新增
- 查询
- 条件查询
- 模糊查询
- 排序查询
- 聚合查询
- 分组查询
- 分页查询
- 修改
- 删除
- 获取器
- 修改器
- 静态属性
- 字段验证
- 外键约束
- 关联模型
- 一对一
- 一对多
- 左外连接
- 多对多
- 字段显示隐藏
- 事务
- 字段自增
- 验证层
- egg-validate
- indicative验证器
- egg-validate-plus
- betterValidate
- 校验规则
- 中间件
- 安全
- 数据加密
- 单向加密
- 示例代码
- 封装egg加密
- 上传
- path模块
- 单文件上传
- 多文件上传
- 按照日期存储
- 工具函数
- egg常用工具函数
- 缓存
- 配置缓存插件
- 设置缓存
- 获取缓存
- 删除缓存
- 消息队列
- rabbitMQ
- 安装
- 简单队列
- 工作队列
- 工作队列(dispach分发)
- 消息应答和持久化
- redis
- 数据类型
- 字符串类型(String)
- 哈希类型(Hash)
- 列表(List)
- 无序集合(Set)
- 可排序集合(Zset)
- 邮件系统
- nodeMailer
- 第三方模块
- 生成随机数
- JWT
- JWT鉴权
- 生成Token
- 短信服务
- 阿里大鱼短信验证码
- 发送短信逻辑
- 阿里短信Node类