推荐答案
在 Koa 中处理文件上传通常使用 koa-body 中间件或 koa-multer 中间件。以下是使用 koa-body 的示例:
// www.javascriptcn.com code example
const Koa = require('koa');
const koaBody = require('koa-body');
const fs = require('fs');
const path = require('path');
const app = new Koa();
app.use(koaBody({
multipart: true,
formidable: {
uploadDir: path.join(__dirname, 'uploads'), // 上传文件保存的目录
keepExtensions: true, // 保留文件扩展名
}
}));
app.use(async (ctx) => {
if (ctx.method === 'POST' && ctx.url === '/upload') {
const file = ctx.request.files.file; // 获取上传的文件
const reader = fs.createReadStream(file.path);
const stream = fs.createWriteStream(path.join(__dirname, 'uploads', file.name));
reader.pipe(stream);
console.log('uploading %s -> %s', file.name, stream.path);
ctx.body = 'Upload Success!';
}
});
app.listen(3000, () => {
console.log('Server is running on http://localhost:3000');
});本题详细解读
1. 使用 koa-body 中间件
koa-body 是一个功能强大的中间件,支持处理多种类型的请求体,包括 JSON、表单数据和文件上传。在处理文件上传时,koa-body 会将上传的文件存储在 ctx.request.files 对象中。
2. 配置 koa-body
在配置 koa-body 时,需要设置 multipart: true 以启用文件上传功能。formidable 选项用于配置 formidable 库,该库负责处理文件上传。常见的配置项包括:
uploadDir:指定上传文件的保存目录。keepExtensions:是否保留文件的扩展名。
3. 处理上传的文件
在路由处理函数中,可以通过 ctx.request.files 访问上传的文件。每个文件对象包含以下属性:
path:文件在服务器上的临时路径。name:文件的原始名称。type:文件的 MIME 类型。size:文件的大小。
可以通过 fs.createReadStream 读取文件,并通过 fs.createWriteStream 将文件写入目标目录。
4. 使用 koa-multer 中间件
koa-multer 是另一个常用的文件上传中间件,基于 multer 库。它提供了更细粒度的控制,适用于需要更复杂文件处理逻辑的场景。
// www.javascriptcn.com code example
const Koa = require('koa');
const Router = require('koa-router');
const multer = require('koa-multer');
const app = new Koa();
const router = new Router();
const upload = multer({ dest: 'uploads/' });
router.post('/upload', upload.single('file'), (ctx) => {
ctx.body = 'Upload Success!';
});
app.use(router.routes());
app.listen(3000, () => {
console.log('Server is running on http://localhost:3000');
});5. 总结
在 Koa 中处理文件上传可以通过 koa-body 或 koa-multer 中间件实现。koa-body 更适合简单的文件上传需求,而 koa-multer 则提供了更多的配置选项,适合复杂的文件处理场景。