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