我觉得我对缓冲区和文件流缺乏了解,但我无法从其他答案中找到任何具体的想法,即将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吗?
答案 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 );