首先必须允许文件上传
const KoaBody = require("koa-body");
// 使用文件上传中间件
app.use(KoaBody({ multipart: true }));
然后是要然外部能访问图片
const serve = require("koa-static");
const path = require("path");
app.use(serve(path.join(__dirname, "/public")));
焯,直接看官方的吧
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(); // note you can pass `multer` options here
// 添加多个文件上传的路由
router.post(
'/upload-multiple-files',
upload.fields([
{
name: 'avatar',
maxCount: 1
},
{
name: 'boop',
maxCount: 2
}
]),
ctx => {
console.log('ctx.request.files', ctx.request.files);
console.log('ctx.files', ctx.files);
console.log('ctx.request.body', ctx.request.body);
ctx.body = 'done';
}
);
// 添加单个文件上传的路由
router.post(
'/upload-single-file',
upload.single('avatar'),
ctx => {
console.log('ctx.request.file', ctx.request.file);
console.log('ctx.file', ctx.file);
console.log('ctx.request.body', ctx.request.body);
ctx.body = 'done';
}
);
// 将路由器添加到我们的应用程序中
app.use(router.routes());
app.use(router.allowedMethods());
// 启动服务器
app.listen(3000);
重要的注意点就是,请求的key值要跟 upload.fields 中的 name 一样,如上我upload.fields中的是 avatar 所以我在请求的时候发送请求的 key 也要写成 avatar ,如下
拿到数据储存到文件
const Router = require("@koa/router");
const multer = require("@koa/multer");
const router = new Router();
const storage = multer.diskStorage({
destination: function (req, file, cb) {
cb(null, "public/uploads/"); // 储存路径
},
filename: function (req, file, cb) {
var fileFormat = file.originalname.split("."); // 获取文件后缀
cb(null, Date.now() + "." + fileFormat[fileFormat.length - 1]); // 生成文件
}
});
const upload = multer({ storage: storage }); // note you can pass `multer` options here
router.post("/upload-single-file", upload.single("avatar"), ctx => {
console.log("ctx.request.file", ctx.request.file);
console.log("ctx.file", ctx.file);
console.log("ctx.request.body", ctx.request.body);
ctx.body = "done";
});
module.exports = router;
示例:
index.js
const Koa = require("koa");
const app = new Koa();
const user = require("./users");
app.use(user.routes(), user.allowedMethods());
app.listen(3005);
upload.js
const multer = require("@koa/multer");
const storage = multer.diskStorage({
destination: function (req, file, cb) {
cb(null, "public/uploads/"); // 储存路径
},
filename: function (req, file, cb) {
var fileFormat = file.originalname.split("."); // 获取文件后缀
cb(null, Date.now() + "." + fileFormat[fileFormat.length - 1]); // 生成文件
}
});
const upload = multer({ storage: storage }); // note you can pass `multer` options here
module.exports = upload;
users.js
const Router = require("@koa/router");
const upload = require("../model/upload");
const router = new Router();
router.post("/upload", upload.single("avatar"), ctx => {
console.log("ctx.request.file", ctx.request.file);
console.log("ctx.file", ctx.file.path);
console.log("ctx.request.body", ctx.request.body);
ctx.body = "done";
});
module.exports = router;