有个需求就是前端发送文件到egg,然后再加上其他属性重新封装再重新以formdata发送。

流向:Client – Server – Third

正常来说,文件上传是简单,但是又要以formdata重新发送就有点问题。官方文档中当读取出文件流后要进行转成本地文件,但是我觉得没必要转本地然后在后面的发送中又转成文件流。然后尝试着保存文件流,最后因为文件流最后要被消费掉,不然响应会阻塞,不得不另寻出路。

// must consume the file stream, or the browser will get stuck
  await sendToWormhole(part);

 

最后想到将文件流转成buffer,新开一个buffer对象,此路应该可以。然后再npm 上搜了一下,找到了

于是最后封装一下方法

'use strict';
const sendToWormhole = require('stream-wormhole')
const Service = require('egg').Service
const toArray = require('stream-to-array')
class Multipart extends Service {
  // 获取mulripart数据
  async getMultipartData(ctx = null) {
    if (ctx) {
      const parts = await ctx.multipart()
      let part;
      let data = []
      while ((part = await parts()) != null) {
        if (part.length) {
          // 新增一个对象,field就是key名,data就是上传的数据,压入data对象数组中。
          data.push({
            field: part[0].replace(/ /g, ''),
            data: part[1]
          })

        } else {
          if (!part.filename) {
            return
          }
          // 转成buffer数组
          const partData = await toArray(part).then(
            function (parts) {
              const buffers = []
              for (let i = 0, l = parts.length; i < l; ++i) {
                const part = parts[i]
                buffers.push((part instanceof Buffer) ? part : new Buffer(part))
              }
              return Buffer.concat(buffers)
            }
          )
          // 新增一个对象,field就是上传key名,data就是buffer数据,fileName上传的文件名(有用),压入data对象数组中。
          data.push({
            field: part.fieldname,
            data: partData,
            fileName: part.filename
          })
          await sendToWormhole(part);
        }
      }
      return data
    }
    return null
  }
module.exports = Multipart

那么封装好后,我们直接使用data数组就可以啦,里面就是key=>value的型式了,完美。

发送formdata填装的时候小心

const form = new FormStream()中
form.file()方式是文件流方式,这里我们改为
form.buffer(key, data, fileName)就可以了

您或许感兴趣

[2018-09-04]基于laravel队列+Redis的秒杀锁库存实现
[2018-08-27]五分钟使用EasyWechat
[2018-09-17]正向代理以及反向代理
[2018-09-17]Nginx的负载均衡及配置

发表评论

电子邮件地址不会被公开。