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

本文介绍了在Node.js的Koa框架中如何使用formidable-upload-koa模块进行文件上传,以及通过koa-send模块实现文件下载。详细讲解了相关路由、控制器的设置,并在app.js中配置静态资源目录。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上传文件使用 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设置为静态资源目录

在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值