关于Buffer 和 stream 的转换,以及tus使用流上传

2021-12-19  本文已影响0人  申_9a33

写electron 遇到一个问题,在主进程中需要使用tus协议上传base64图片到服务器中,可以使用File,Blob,stream,但是node 中没有定义File,Blob,所以方案只剩下stream

具体思路就是一个将base64转换为Buffer,然后创建一个Readable,重新定义内部的_read,开始撸代码

const {Upload} = require('tus-js-client')
const { Readable } = require('stream')
// const fs = require('fs')

const b64 = 'iVBORw0KGgoAAAANSUhEUgAAABcAAAAUCAMAAABRYFY8AAABvFBMVEUAAAAA//+A//9V//9t2/9g3/9q1f9i2P9b2/9m3f9k3v9m1v9i2P9e2f9h3P9e3f9j1v9g1/di2vhf2/hi2Phg2flk2vlh2/lf2/9j3Ple2Plk2P9j2fpj2vth2/ti3Ptg3Pti2fxg2fxj2vxh2vxi2/xg2fxg2/xh2fxg2fxg2vxi2/xh2/xi2fxh2fxg2/pi2/ph2fpg2fpi2vph2vpi2vph2/pg2/pi2fph2fpg2vph2vpi2/pg2/tf2vtg2v1i2Pth2/ti2fth2/tg2vti2vxh2vxi2vxg2/xh2/xg2fxg2/xi2/xh2/pi2fpi2/pi2/xh2fph2/xh2vpi2vph2/pi2/th2vtg2vtg2/th2fth2vtg2fth2fth2vth2vth2vti2vth2vtg2vti2vth2/th2/tg2vth2vth2fth2/th2vth2vth2vth2vth2/th2vth2vtg2vth2/th2vth2vth2vxh2vxg2vxh2fph2fxi2fph2vxi2vxh2vth2fth2vtg2vti2vth2fth2vth2vth2vxg2vth2fth2vxh2vti2vth2vth2vth2vxh2vxh2vth2/th2vv////4XwlDAAAAknRSTlMAAQIDBwgMDQ4PFxkaGx0eHyAiIycoKSorLC4uNj4/QUhJSktMTlBVV1haW1xeX2JjZGVmZ2hpamtsbW5went9fX5/gY+SmZmam5ycnKGioqKjo6WnqKqrrKytrq+wsbKztLW8vL2+wcPFxcbHyMrLz9DR0tPU3N3e4ODg4uPk5eXm5ufo6enq6+vt7vP09PX9/WqOKMQAAAABYktHRJPhA9+2AAABT0lEQVQY02NgAAGdhu4QMSAtHtrdoM0AB9wtQuxWzaYM5s3mbEKtXHBxLV8gwV+cWcgHpIM14OIWLiDSuc8RRLmawMU1A4GEWplEuSpIvTpcXKqYT9mhJ8AtqMdeha9UEiYs7z2xJrYqwdTYNLE6rnaCjzxYVDy3wDzKUDOPGchmztM0DjMvyBEHCjcCHayUWSHDGt0bwSJTkaXAwKjTKMrgZQZUx9SRzGA0adIkQ4bUNiaQAz0ZvCxA4p0pDIZAcQOGtHaQuKUng1ijLiODckaFDEtEbzjIHEUGRj2gOQxi2UWWMfpQe/M1jCKtijJFwS6S85hYH1+daG5snlSZ0DTBXRburyJeRbsef7fAHltFnhJJ1HBQLZeuUEENB0i4OfXboYWblh+QECxNLxZADWdgvHDaNBszmDRbcwgjxQuDdl1XoAiQFg3uqtMCiwAAuedLYTKQiTIAAAAASUVORK5CYII='
const b64Buf = Buffer.from(b64,"base64")

class MyReadable extends Readable {
    
    constructor(options) {
      // Calls the stream.Readable(options) constructor
      super(options);

      this.b64Count = 0
    }
    _read(size) {
        const end = this.b64Count + size
        const buf = b64Buf.subarray(this.b64Count,end)

        console.log(this.b64Count,buf.length,size,'_read')
        if(buf.length !== 0){
            this.push(buf)
        }else{
            this.push(null)
        }

        this.b64Count = end
    }
}

const rs = new MyReadable()

// const writer = fs.createWriteStream('./test/test.text')
// rs.pipe(writer)


var options = {
    endpoint: 'http://localhost:8080/files/files/',
    metadata: {
      filename: 'test.png',
      filetype: 'image/png',
    },
    chunkSize: 16384,
    uploadSize: b64Buf.length,
    onError (error) {
      throw error
    },
    onProgress (bytesUploaded, bytesTotal) {
      var percentage = (bytesUploaded / bytesTotal * 100).toFixed(2)
      console.log(bytesUploaded, bytesTotal, `${percentage}%`)
    },
    onSuccess () {
      console.log('Upload finished:', upload.url)
    },
  }

  var upload = new Upload(rs, options)
  upload.start()

上一篇下一篇

猜你喜欢

热点阅读