koa2路由请求使用formidable接收formdata文件并存在本地
时间: 2024-04-29 21:25:28 浏览: 142
首先需要安装 `koa2` 和 `formidable` 模块:
```shell
npm install koa2 formidable --save
```
然后在`app.js`中引入模块:
```javascript
const Koa = require('koa');
const router = require('koa-router')();
const formidable = require('formidable');
const path = require('path');
const fs = require('fs');
const app = new Koa();
```
接着编写路由:
```javascript
router.post('/upload', async (ctx) => {
// 创建formidable.IncomingForm实例
const form = new formidable.IncomingForm();
// 设置文件上传存放地址
form.uploadDir = path.join(__dirname, 'public', 'uploads');
// 保留上传文件的扩展名
form.keepExtensions = true;
// 解析请求
const { fields, files } = await new Promise((resolve, reject) => {
form.parse(ctx.req, (err, fields, files) => {
if (err) {
reject(err);
} else {
resolve({ fields, files });
}
});
});
// 将上传的文件重命名并移动到指定目录
const file = files.file;
const fileName = Date.now() + '_' + file.name;
const filePath = path.join(form.uploadDir, fileName);
await new Promise((resolve, reject) => {
fs.rename(file.path, filePath, (err) => {
if (err) {
reject(err);
} else {
resolve();
}
});
});
ctx.body = {
code: 0,
message: '上传成功',
data: {
url: '/uploads/' + fileName,
name: file.name,
size: file.size,
type: file.type,
},
};
});
```
在路由中,我们首先创建一个 `formidable.IncomingForm` 实例,设置文件上传存放地址和保留上传文件的扩展名。
然后通过 `form.parse(ctx.req, (err, fields, files) => {...})` 方法解析请求,得到上传的表单字段和文件。
最后将上传的文件重命名并移动到指定目录,在响应中返回上传结果。
最后在 `app.js` 中挂载路由:
```javascript
app.use(router.routes()).use(router.allowedMethods());
```
现在启动服务,访问 `/upload` 接口即可上传文件并保存在本地。
阅读全文