按照日期存储

优质
小牛编辑
139浏览
2023-12-01

基于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()
    // 返回图片保存路径 apppublicadminuploads201907121562946142820.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;