多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
[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; ```