21.nodejs中koa框架上传下载文件 formidable-upload-koa

上传文件使用 formidable-upload-koa 模块

下载文件使用 koa-send 模块

router

const router = require('koa-router')()
const koaForm = require('formidable-upload-koa')
const { saveFile } = require('../controller/files')
const send = require('koa-send')
const path = require('path')

// 下载模块的参数
const options = {
  uploadDir: `${__dirname}/`,  // 文件存放的位置
  keepExtensions: true,  // 包含扩展名
  maxFileSize: 1024 * 1024 // 大小为 1m
}

// 上传
router.post('/upload', koaForm(options), async (ctx, next) => {
  const file = ctx.req.files['file']  // 在ctx.req.files里获取到上传的文件,['file']是前端input上传文件组件的name属性值
  const { size, path, name, type } = file  // file 里面的参数
  ctx.body = await saveFile({  // 将文件移动的静态资源目录,用于下载
    name,
    type,
    size,
    filePath: path
  })
})

// 下载
router.get('/download', async (ctx, next) => {
  const fileName = ctx.query.filename // 文件名
  const dir = path.join(__dirname, '..', 'uploadFiles')  // 静态资源目录
  ctx.attachment(fileName)
  try {
    await send(ctx, fileName, { root: dir})
  } catch (e) {
    ctx.throw(404, '文件不存在')
  }
})
module.exports = router

controller

const fse = require('fs-extra')
const path = require('path')
const MIX_SIZE = 1024 * 1024 * 1024


async function saveFile({ name, type, size, filePath }) {
  if (size > MIX_SIZE) {
    await fse.remove(filePath)
    return Promise.reject('文件体积过大')
  }
  // 重新命名文件
  const fileName = Date.now() + '.' + name
  // 目的地
  const DIST_FOLDER_PATH = path.join(__dirname, '..', 'uploadFiles')
  const distFilePath = path.join(DIST_FOLDER_PATH, fileName)
  // 移动
  await fse.move(filePath, distFilePath)

  // 返回
  return Promise.resolve({
    url: `http://127.0.0.1:3000/${fileName}`
  })
}

module.exports = {
  saveFile
}

在app.js将uploadFiles设置为静态资源目录

在这里插入图片描述

©️2020 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页