上传文件
遇到的问题:
最开始用koa-multer,接口没问题回调执行了,但是文件没有传上去。
折腾了两天,发现注释掉 app.use(koabody()) 就可以上传了(这个问题不知道有没有人遇到过,可能是我写的有问题,如果知道是什么问题请给我留言),但是不用koa-body没办法接收post请求。
查了一下资料发现只用 koa-body 就可以完成需求, 并不需要其他中间件。
koa-body两种上传文件的方法
1、koa-body自带的方法
这种方法接口都不用写,你没看错,不用写接口,如果前端不在意是否有返回数据的话
const koabody = require("koa-body");
app.use(koabody({
"multipart": true, //接收form表单数据
formidable: {
uploadDir: './', //文件保存路径
keepExtensions: true, //保持源文件的扩展
onFileBegin: (name, file) => { //文件保存之前的预处理
file.path = file.name; //保存文件名改为源文件的文件名,否则文件名随机
}
}
}));
当然也可以写个接口,并不影响文件保存,可以同时进行其他操作。
2、从post接口中读取文件并保存
由于我在上传图片的url里带了一个id,要根据不同的id存到不同的文件夹下,所以如果用第一个方法需要在接口回调里读文件,然后复制到相应的文件夹下,再删除这个临时文件,非常麻烦,可以用这个方法直接存到相应的文件夹下
写一个post接口用来接收上传文件的数据,然后让我们来看一下 ctx.request.body image.png]app.use(koabody({"multipart": true})); //这个还是要的

里边的files对象就是传上来的文件,是一个集合,可以多文件同时上传,接下来要把数据还原成文件写到磁盘:
const fs = require("fs");
const path = require('path');exports.upload = (ctx) => {
function witeFile(file){
const filePath = path.join(tmpdir, file.name);
const reader = fs.createReadStream(file.path);
const writer = fs.createWriteStream(filePath);
reader.pipe(writer);
filePaths.push(filePath);
}
let id = ctx.url.split('id=')[1];
let tutorialsPath = `${carTutorialsPath}/${id}`;
//这里是自定义的路径
if (!fs.existsSync (tutorialsPath)) {
fs.mkdirSync (tutorialsPath);
}
const tmpdir = path.join(tutorialsPath);
const filePaths = [];
const files = ctx.request.body.files || {};
const params = ctx.request.body.fields
for (let key in files) {
const file = files[key];
if(Object.prototype.toString.call(file) == '[object Array]'){
for(var j = 0; j < file.length; j++ ){
witeFile(file[j]);
}
}else{
witeFile(file);
}
}
return true;
}
在post函数中调用,把ctx直接传进来就可以了
这里是fs官方api:http://nodejs.cn/api/fs.html
网友评论