从Base64编码的字符串创建ReadStream

时间:2018-01-31 04:17:53

标签: javascript node.js base64 fs

我觉得我对缓冲区和文件流缺乏了解,但我无法从其他答案中找到任何具体的想法,即将base64字符串视为实际文件。

我使用Npm的'request'包,通过http,multipart协议将文件发送到其他服务器。

以下代码运行良好,通过'fs'包从实际文件中读取文件,并通过createReadStream方法通过ReadStream对象发送。

(代码是coffeescript)

#working
res = request.postSync 'http://anotherUrl/uploadDocument',
  formData: file: fs.createReadStream('/path/' + 'myfile.doc')  

我想要做的是通过fs模块从文件Based64编码的字符串创建一个相同的ReadStream对象。

我测试过这样的东西,但是它运行不正常。

#not working
res = request.postSync 'http://anotherUrl/uploadDocument',
  formData: file: new Buffer(base64EncodedString, 'base64')

#not working
res = request.postSync 'http://anotherUrl/uploadDocument',
  formData: file: _base64ToArrayBuffer(base64EncodedString)

#not working
res = request.postSync 'http://anotherUrl/uploadDocument',
  formData: file: convertDataURIToBinary(base64EncodedString)

##(used function)
_base64ToArrayBuffer = (base64) ->
  binary_string = require('atob')(base64)
  len = binary_string.length
  bytes = new Uint8Array(len)
  i = 0
  while i < len
    bytes[i] = binary_string.charCodeAt(i)
    i++
  bytes.buffer

convertDataURIToBinary = (dataURI) ->
  BASE64_MARKER = ';base64,'
  base64Index = dataURI.indexOf(BASE64_MARKER) + BASE64_MARKER.length
  base64 = dataURI.substring(base64Index)
  raw = require('atob')(base64)
  rawLength = raw.length
  array = new Uint8Array(new ArrayBuffer(rawLength))
  i = 0
  while i < rawLength
    array[i] = raw.charCodeAt(i)
    i++
  array

问题结论

'base64EncodedString'由decode&amp;创建文件,所以我不怀疑这是事情,所以我想我可以通过base64的写文件获得这个成就,并用fs模块再次读取它,但我相信这不是正确的方法。

问题在于, 1.在这种情况下,如何正确地将base64encoded字符串作为ReadStream对象发送 2.我怎样才能清楚地找出缓冲区和数据视图(uint8array ......)之间的关系

提前致谢。

附录

根据@Alex Nikulin的评论,我测试了流缓冲包。

streamBuffers = require('stream-buffers')
myReadableStreamBuffer = new (streamBuffers.ReadableStreamBuffer)(
  frequency: 10
  chunkSize: 2048)
myReadableStreamBuffer.put base64.decode example
myReadableStreamBuffer.stop()

当我尝试下来时它再次失败,'AnotherUrl'返回错误信息,'意外结束'

res = request.postSync 'http://anotherUrl/uploadDocument',
  formData: file: myReadableStreamBuffer

我发现myReadableStreamBuffer对象是Readable对象,因此可能与ReadStream对象不同。我可以从myReadableStreamBuffer获取它作为ReadStream吗?

1 个答案:

答案 0 :(得分:2)

试试这个

  //if you need just a buffer
  var base64ToBuffer = function(base64) {

        var byteString = new Buffer(base64, 'base64').toString('binary');

        var ab = new Buffer(byteString.length);
        var ia = new Uint8Array(ab);
        for (var i = 0; i < byteString.length; i++) {
            ia[i] = byteString.charCodeAt(i);
        }

        return ab;
  }
//if you need a stream, not a buffer
var stream = require('stream');

// Initiate the source
var bufferStream = new stream.PassThrough();

// Write your buffer
bufferStream.end(base64ToBuffer(base64));
bufferStream.pipe( process.stdout );