Javascript 按文件从Base64编码的字符串创建ReadStream

Javascript 按文件从Base64编码的字符串创建ReadStream,javascript,node.js,base64,fs,Javascript,Node.js,Base64,Fs,我觉得我对缓冲区和文件流缺乏了解,但我无法从其他答案中找到任何具体的想法,即将base64字符串作为实际文件处理 我使用来自Npm的“请求”包,通过http、多部分协议将文件发送到其他服务器 下面的代码运行良好,通过“fs”包从实际文件中读取一个文件,并通过createReadStream方法通过ReadStream对象发送该文件 (代码为coffeescript) 我想做的是由fs模块从一个基于文件的64编码字符串创建一个相同的ReadStream对象 我测试了类似的东西,但它不能正常工作 #

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

我使用来自Npm的“请求”包,通过http、多部分协议将文件发送到其他服务器

下面的代码运行良好,通过“fs”包从实际文件中读取一个文件,并通过createReadStream方法通过ReadStream对象发送该文件

(代码为coffeescript)

我想做的是由fs模块从一个基于文件的64编码字符串创建一个相同的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
当我尝试使用bellow时,它再次失败,“AnotherUrl”返回如下错误消息,“意外结束部分”

res = request.postSync 'http://anotherUrl/uploadDocument',
  formData: file: myReadableStreamBuffer
我发现myReadableStreamBuffer对象是可读对象,所以它可能与ReadStream对象不同。我可以从myReadableStreamBuffer以ReadStream的形式获取它吗?

试试这个

  //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 );
//如果您只需要一个缓冲区
var base64ToBuffer=函数(base64){
var byteString=新缓冲区(base64,'base64')。toString('binary');
var ab=新缓冲区(byteString.length);
var ia=新的UINT8阵列(ab);
for(var i=0;i
试试这个

  //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 );
//如果您只需要一个缓冲区
var base64ToBuffer=函数(base64){
var byteString=新缓冲区(base64,'base64')。toString('binary');
var ab=新缓冲区(byteString.length);
var ia=新的UINT8阵列(ab);
for(var i=0;i
谢谢您的快速回答,但它不起作用。数据联网很好,但“另一个系统”的处理无法接受这种数据缓冲区。因此,我认为我需要与fs pacakge中的ReadStream相同的对象。实际上,这部分是我不了解的,但是“fs.createReadStream('/path/'+'myfile.doc')”正在工作,我发现返回的对象是ReadStream对象。所以我不得不再问你一次,因为我不理解。。node.js的ReadStream是ArrayBuffer还是Blob?@jwjin no来自客户端js,而不是nodejs。你需要这个我尝试了你的建议并添加了一些附录代码。你能再解释一下吗?谢谢。@jwjin你的问题是什么?谢谢你的快速回答,但它不起作用。数据联网很好,但“另一个系统”的处理无法接受这种数据缓冲区。因此,我认为我需要与fs pacakge中的ReadStream相同的对象。实际上,这部分是我不了解的,但是“fs.createReadStream('/path/'+'myfile.doc')”正在工作,我发现返回的对象是ReadStream对象。所以我不得不再问你一次,因为我不理解。。node.js的ReadStream是ArrayBuffer还是Blob?@jwjin no来自客户端js,而不是nodejs。你需要这个我尝试了你的建议并添加了一些附录代码。你能再解释一下吗?谢谢。@jwjin你有什么问题?
  //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 );