前端二进制流转Blob转base64,Nodejs写入等(V3+TS)、国密SM4加密文件流

Nodejs http https模块get请求 管道下载 / 收集完转其他

import https from 'https'

import http from 'http'

const stream = fs.createWriteStream(path)

const httpName = this.fileUrl.includes('https') ? https : http

const request = httpName.get(

          this.fileUrl,

          {

            headers: {  }, // 可携带token

            timeout: 0, // 0 不超时 

            rejectUnauthorized: false // 用于https证书

          },

          (res: any) => {

            // 文件总长度

            const len = parseInt(res.headers['content-length'])

            let cur = 0

            // 通过pipe管道写入

            res.pipe(stream)

            res.on('data', (chunk: any) => {

              chunks.push(chunk)

              cur += chunk.length

              // 当前进度

              const progress: number = Number(((100.0 * cur) / len).toFixed(2))

              // 当前下载了多少M

              // const currProgress = (cur / 1048576).toFixed(2)

              // console.log('当前下载进度:' + progress)

            })

            // 下载结束 -> 后触发 stream.on('finish')

            res.on('end', () => {

               // 如果用了pipe,就不要用这个。 Buffer.concat(chunks).toString('base64')就可以转换为base64格式了

              //  stream.write(Buffer.concat(chunks))

              //  stream.end()

              }

            })

          }

        )

注意:如果需要对文件加解密就是对Buffer加解密,例如SM4对Buffer加解密


const sm4 = require('sm-crypto').sm4

export function stringToHex(str: string) {

  const len: number = str.length

  let val = ''

  for (let i = 0; i < len; i++) {

    val += '' + str.charCodeAt(i).toString(16)

  }

  return val

}
// 解密

const deChunk = sm4.decrypt(Buffer.concat(chunks), stringToHex(key), { output: 'array' })

new Blob([Buffer.from(deChunk)], { type: 'image/png' })

// 加密  (对buffer加密,加密后在转base64 或者 Blob)

const enChunk = sm4.encrypt(getBufferByFile(file), stringToHex(key),  { output: 'array' })

blob -> new Blob([Buffer.from(enChunk)], { type: 'image/png' })

base64 -> Buffer.from(enChunk).toString('base64')

再调用接口上传

文件转Buffer(二进制)

const getBufferByFile = async (file: File | Blob): Promise<Buffer> => {

  const arrayBuffer = await file.arrayBuffer()

  return Buffer.from(arrayBuffer)

}

Buffer转Base64

Buffer.from(arrayBuffer).toString('base64')

base64转Blob

const base64ToBlob = (b64data: string, contentType: string, sliceSize = 512) => {

  return new Promise((resolve) => {

    // 使用 atob() 方法将数据解码

    const byteCharacters = atob(b64data)

    const byteArrays = []

    for (let offset = 0; offset < byteCharacters.length; offset += sliceSize) {

      const slice = byteCharacters.slice(offset, offset + sliceSize)

      const byteNumbers = []

      for (let i = 0; i < slice.length; i++) {

        byteNumbers.push(slice.charCodeAt(i))

      }

      // 8 位无符号整数值的类型化数组。内容将初始化为 0。

      // 如果无法分配请求数目的字节,则将引发异常。

      byteArrays.push(new Uint8Array(byteNumbers))

    }

    let result = new Blob(byteArrays, {

      type: contentType

    })

    result = Object.assign(result, {

      // jartto: 这里一定要处理一下 URL.createObjectURL

      preview: URL.createObjectURL(result),

      name: `图片示例.png`

    })

    resolve(result)

  })

}

blob转base64

const blobToBase64 = (blob: Blob | File): Promise<string> => {

  return new Promise((resolve, reject) => {

    const fileReader = new FileReader()

    fileReader.onload = (e) => {

      e.target ? resolve(e.target.result as string) : reject(new Error('文件流异常'))

    }

    fileReader.readAsDataURL(blob)

    fileReader.onerror = () => {

      reject(new Error('文件流异常'))

    }

  })

}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容