[TOC]
### egg 单文件上传
* [ ] 通过`ctx.getFileStream`便捷的获取到用户上传的文件,需要满足两个条件:
* 只支持上传一个文件。
* 上传文件必须在所有其他的 fields 后面,否则在拿到文件流时可能还获取不到 fields。
*****
文档:[https://eggjs.org/zh-cn/basics/controller.html](https://eggjs.org/zh-cn/basics/controller.html)
代码:
```
'use strict';
const Controller = require('egg').Controller;
const path = require('path')
const fs = require('fs')
const sendToWormhole = require('stream-wormhole');
class UserController extends Controller {
/**
* 上传用户头像
*/
async upload() {
const { ctx } = this
// 读取表单提交的文件流
const stream = await ctx.getFileStream()
// 获取上传的文件名 like.jpg dog.png
const file_name = path.basename(stream.filename)
// 拼接上传路径
const upload_path = 'app/public/admin/uploads/' + file_name
// 创建一个可以写入的流
const writeStream = fs.createWriteStream(upload_path)
let result;
try {
// 把读取到的表单信息流写入创建的可写流
result = await stream.pipe(writeStream)
} catch (err) {
// 上传失败销毁流
await sendToWormhole(stream)
throw err
}
ctx.body = {
url: upload_path, // 上传路径
fields: stream.fields // 所有表单字段都能通过 `stream.fields` 获取到
}
}
}
module.exports = UserController;
```
*****
### 使用 pump 插件上传
* [ ] 文档:https://www.npmjs.com/package/pump
* [ ] 首先安装 npm install pump
* [ ] 代码:
```
'use strict';
const Controller = require('egg').Controller;
const path = require('path')
const fs = require('fs')
const pump = require('pump')
class UserController extends Controller {
/**
* 上传用户头像
*/
async upload() {
const { ctx } = this
// 读取表单提交的文件流
const stream = await ctx.getFileStream()
// 获取上传的文件名 like.jpg dog.png
const file_name = path.basename(stream.filename)
// 拼接上传路径
const upload_path = 'app/public/admin/uploads/' + file_name
// 创建一个可以写入的流
const writeStream = fs.createWriteStream(upload_path)
// 第一个参数读取流,第二个参数可写流, 上传失败会自动销毁流
await pump(stream, writeStream)
ctx.body = {
url: upload_path, // 上传路径
fields: stream.fields // 所有表单字段都能通过 `stream.fields` 获取到
}
}
}
module.exports = UserController;
```
- 概述
- 起步
- 跨域配置
- 路径别名
- 路由
- 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类