[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類