• Nodejs koa实现上传文件


    前几天在弄文件上传demo,于是自己先搭建上传文件的环境,废话不多说,开整;

      我用的koa脚手架,实现文件上传的话要用的  koa-body  第三方中间件

    首先在app.js 引入并且使用(koaBody 里面的参数在npm上有参考)

    const Koa = require('koa')
    const app = new Koa()
    const views = require('koa-views')
    const json = require('koa-json')
    const onerror = require('koa-onerror')
    const bodyparser = require('koa-bodyparser')
    const logger = require('koa-logger')
    const koaBody = require('koa-body')
    const path = require('path')
    
    const index = require('./routes/index')
    const users = require('./routes/users')
    
    // error handler
    onerror(app)
    
    // middlewares
    // app.use(bodyparser({
    //   enableTypes: ['json', 'form', 'text']
    // }))
    app.use(json())
    app.use(logger())
    app.use(require('koa-static')(__dirname + '/public'))
    
    app.use(views(__dirname + '/views', {
      extension: 'ejs'
    }))
    
    app.use(koaBody({
      multipart: true,
      formidable: {
        maxFileSize: 200 * 1024 * 1024    // 设置上传文件大小最大限制,默认2M
      }
    }));
    
    
    // 配置跨域
    app.use(async (ctx, next) => {
      ctx.set('Access-Control-Allow-Origin', '*');
      ctx.set('Access-Control-Allow-Headers', 'Content-Type, Content-Length, Authorization, Accept, X-Requested-With , yourHeaderFeild');
      ctx.set('Access-Control-Allow-Methods', 'PUT, POST, GET, DELETE, OPTIONS');
      // Content-Type表示具体请求中的媒体类型信息
      ctx.set("Content-Type", "application/json;charset=utf-8");
      await next();
    })
    
    // logger
    app.use(async (ctx, next) => {
      const start = new Date()
      await next()
      const ms = new Date() - start
      console.log(`${ctx.method} ${ctx.url} - ${ms}ms`)
    })
    
    // routes
    app.use(index.routes(), index.allowedMethods())
    app.use(users.routes(), users.allowedMethods())
    
    // error-handling
    app.on('error', (err, ctx) => {
      console.error('server error', err, ctx)
    });
    
    module.exports = app

    然后在index.js

    router.post('/upload', async (ctx, next) => {
      // console.log(ctx.request.files);
      const files = ctx.request.files[''];
      // console.log(files[0].path);
      files.forEach(item => {
        const reader = fs.createReadStream(item.path);
        //获取上传文件扩展名
        let filePath = path.join(__dirname, '../data/') + `/${item.name}`;
        console.log(filePath);
        const upStream = fs.createWriteStream(filePath);
        //可读流通过管道写入可写流
        reader.pipe(upStream);
      })
    
      ctx.body = {
        meg: "successul",
        code: 200,
        data: null
      }
    })

    PS:坑1:低版本的fiel在 ctx.request.body中,这是前面看别人的文章,新版本的话是在ctx.request.files中;

      坑2:多文件是一个对象,他的key是‘’,也就有了第一个  ctx.request.files[‘ ’],然后使用循环插入到存储的文件中;

      因为看前面的文章别人使用 for in 直接循环的,直接报错 path 什么错误的 

      直达:https://www.jianshu.com/p/34d0e1a5ac70

    
    
    

        

  • 相关阅读:
    mysql 语法
    mycat 配置简介
    redis sentinel 配置
    Spark SQL 读到的记录数与 hive 读到的不一致
    HDP3.1 中 YRAN 和 MR2 的内存大小配置的计算方式
    在 windows 下搭建 IDEA + Spark 连接 Hive 的环境
    HDP3.1 中配置 YARN 的 timeline server 使用外部的 HBase
    大规模使用 Apache Kafka 的20个最佳实践
    卸载mac版本的GlobalProtect
    js解决约瑟夫问题
  • 原文地址:https://www.cnblogs.com/yezi1116/p/16107270.html
Copyright © 2020-2023  润新知