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