egg上传Excel读取内容并保存

问题产生背景

我们的后端服务采用的eggjs,用来处理一下轻量级的用户服务,比如说用户基本信息的保存、文件等等。
这次有一个上传Excel 文件保存并读取内容返回给前端的需求,经过一步步采坑(本人小菜鸟一只),终于实现了,把这个过程分享给大家,希望能够帮助要采坑的同学,跳坑。

解决方法

1、上传文件

这里可以参考网上提到的多种方式ajax方式或者from方式,当然啦我这里采用的是from方式。
当然你也可以采用其他方式。

2、获取上传的文件内容

egg上传Excel读取内容并保存_第1张图片
这部分可以参考egg的官方文档,写的比较清楚:
egg文档

3、读取上传的Excel文件中的内容

这里我们需要使用插件来处理Excel,xlsx js 
使用方法很简单:
1、安装
npm install xlsx --save-dev 
或者:
yarn add xlsx --save-dev
2、引入
const XLSX = require('xlsx');
3、使用	
 const stream = await ctx.getFileStream();
    // 存储获取到的数据
    let exceldata = [];
    stream.on('data', function(chunk) {
      // 读取内容
      const workbook = XLSX.read(chunk, { type: 'buffer' });
      // 遍历每张工作表进行读取(这里默认只读取第一张表)
      for (const sheet in workbook.Sheets) {
        if (workbook.Sheets.hasOwnProperty(sheet)) {
          // 利用 sheet_to_json 方法将 excel 转成 json 数据
          exceldata = exceldata.concat(XLSX.utils.sheet_to_json(workbook.Sheets[sheet]));
          // break; // 如果只取第一张表,就取消注释这行
        }
      }
    });
    console.log(exceldata);  // 打印解析出来的Excel 内容

这里我们采用buffer方式来解读fileStream

对xlsx有疑问的同学可以参考这篇文章:
https://www.cnblogs.com/liuxianan/p/js-excel.html
https://segmentfault.com/a/1190000004395728

4、保存上传的Excel文件

这里我们需要用到很多插件
yarn add fs path await-stream-ready stream-wormhole --save-dev
具体代码操作如下:

// 文件操作对象
const fs = require('fs');
// 路径操作对象
const path = require('path');
// 异步二进制 写入流
const awaitWriteStream = require('await-stream-ready').write;
// 管道读入一个虫洞。
const sendToWormhole = require('stream-wormhole');

// 操作存储文件
const stream = await ctx.getFileStream();
    //新建一个文件名    
    const filename = stream.filename.split('.')[0] + path
      .extname(stream.filename)
      .toLocaleLowerCase();

    //文件生成绝对路径
    const target = path.join(this.config.baseDir, 'app/public/uploads', filename);
    //生成一个文件写入 文件流
    const writeStream = fs.createWriteStream(target);
    try {
      //把文件流 写入
      await awaitWriteStream(stream.pipe(writeStream));
    } catch (err) {
      //出错则关闭管道
      await sendToWormhole(stream);
      throw err;
    }

写在最后

总结几个坑点:
1、上传文件提示filetype undefined (图片可以上传,不报错)
这个问题产生的原因是没有给egg指定上传文件的类型,解决方法:
在config中增加如下配置:

// config/config.default.js
exports.multipart = {
  mode: 'file',  // 对应文件类型 
};

egg上传Excel读取内容并保存_第2张图片

2、读取Excel文件内容的时候,如果要采用跟我说明的这个比较类似的情况的话,
一定要将文件读取的方式改为buffer方式。

 const workbook = XLSX.read(chunk, { type: 'buffer' });

你可能感兴趣的:(前端开发,node.js)