美文网首页
koa 上传文件

koa 上传文件

作者: 风中的猴子 | 来源:发表于2018-07-10 09:56 被阅读0次

上传文件

遇到的问题:

最开始用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存到不同的文件夹下,所以如果用第一个方法需要在接口回调里读文件,然后复制到相应的文件夹下,再删除这个临时文件,非常麻烦,可以用这个方法直接存到相应的文件夹下

app.use(koabody({"multipart": true}));  //这个还是要的

写一个post接口用来接收上传文件的数据,然后让我们来看一下 ctx.request.body image.png] image.png

里边的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

相关文章

  • koa 使用记录

    koa-body: 实现文件上传(form action=“...url” 提交表单式上传) koa-parser...

  • 关于 koa-formidable 一些问题

    这两天在研究node + koa + koa-formiable 上传图片和文件 最简单的使用方法 文件已经上传...

  • koa 上传文件

    上传文件 遇到的问题: 最开始用koa-multer,接口没问题回调执行了,但是文件没有传上去。折腾了两天,发现注...

  • koa文件上传

    demo地址 使用 koa-body 中间件获取上传的文件 koa-body 支持文件、json、form格式的请...

  • 文件上传

    node 上传文件 可以使用koa-body 中间件进行上传.但是一定要注意koa-body版本的问题.和异步问题...

  • koa实现文件上传

    文件上传是一个经常要用到的功能,这里对基于koa实现文件上传做一个总结。PS:在我的另外一篇博客讲到了图片上传的前...

  • koa-body 获取不到文件的原因

    问题描述:在koa项目中,使用koa-body中间件来实现文件的上传功能,但是通过ctx.request.body...

  • 100-days-Coding - day8

    day8-0808 form表单同时上传文件和数据 Koa作为sever 未完待续......

  • 11KOA 文件上传

    文件上传 安装上传中间件 使用中间件完成上传功能

  • html5拖放上传文件

    记录一个html5文件上传和接收的示例 前端 nodejs koa后端demo

网友评论

      本文标题:koa 上传文件

      本文链接:https://www.haomeiwen.com/subject/qbaxpftx.html