本文详解Node.js中文件上传接口的实现方案。针对koa-body接收失败的问题,推荐使用koa-multer中间件解决;同时提供基于Express框架的完整代码示例,涵盖multer配置、文件读写及路由设置,帮助开发者快速搭建稳定可靠的文件上传服务。
Node.js 文件上传接口开发中的常见陷阱与解决方案
在开发 Node.js 后端接口时,若需向前端提供文件上传功能,选择合适的中间件至关重要。网络上常见的 koa-body 中间件在实际测试中常出现无法正确接收文件字段(file)的问题。经过对比测试,采用 koa-multer 中间件可以完美解决文件接收失败的问题。
首先,需要通过 npm 安装 koa-multer 依赖包:npm i koa-multer
在应用入口文件 app.js 中引入该中间件,并配置相应的路由逻辑。
以下是控制器层面的核心代码实现:

对应的路由配置代码如下:


通过上述配置,即可实现文件上传接口的稳定运行。
基于 Node.js (Express) 的图片上传接口实现方案
作为后端开发者,本节将演示如何使用 Node.js 编写一个标准的图片上传接口。
开发前需明确所需环境
基础运行环境为 Node.js 结合 Express 框架。
const multer = require('multer');
const fs = require('fs')
const path = require('path')实现该功能主要依赖三个核心模块:用于处理文件上传的接口模块、负责文件读取的 fs 模块,以及用于处理路径设置的 path 模块。
具体实现步骤与代码展示
以下是完整的实现代码示例:
const multer = require('multer');
const fs = require('fs')
const path = require('path')
module.exports = (app) => {
let upload = multer({ dest: 'uploads/' })
app.post('/img', upload.single('test'), function(req, res, next) {
//读取文件路径(uploads/文件夹下面的新建的图片地址)
console.log(req.file);
fs.readFile(req.file.path, (err, data) => {
//如果读取失败
if (err) { return res.send('上传失败') }
//如果读取成功
//声明图片名字为时间戳和随机数拼接成的,尽量确保唯一性
let time = Date.now() + parseInt(Math.random() * 999) + parseInt(Math.random() * 2222);
//拓展名
let extname = req.file.mimetype.split('/')[1]
//拼接成图片名
let keepname = time + '.' + extname
//三个参数
//1.图片的绝对路径
//2.写入的内容
//3.回调函数
fs.writeFile(path.join(__basename, '/public/img/' + keepname), data, (err) => {
if (err) { return res.send('写入失败') }
res.send({ err: 0, msg: '上传ok', data: '/public/img/' + keepname })
});
});
});
}对核心代码逻辑进行分解说明:
fs.readFile(req.file.path, (err, data)=>{
if(err){res.send('读取失败')}
})
//一个是读取部分一个是写入部分,主要就这两部分。
fs.writeFile(path.join(__basename, '/public/img/' + keepname), data, (err) => {
if (err) { return res.send('写入失败') }对于正在学习 Node.js 的初学者,建议在入口文件配置中间件后,务必添加上述两段关键代码,以确保文件处理流程正确执行。
//head
let express =require('express')
let router =require('/your router path')
const app =express()
...
//main
router(app)
//other
app.use((req, res) => {
res.status(404).send('没有找到资源')
})
app.listen(8080)以上为个人实践经验总结,旨在为开发者提供参考,欢迎交流支持。