gpt4 book ai didi

javascript - 按文件从 Base64 编码字符串创建 ReadStream

转载 作者:太空宇宙 更新时间:2023-11-04 03:22:36 26 4
gpt4 key购买 nike

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

我使用了 Npm 中的“request”包,通过 http、多部分协议(protocol)将文件发送到其他服务器。

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

(代码是coffescript)

#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”通过解码和创建文件进行验证,所以我不怀疑这是问题,所以我认为我可以通过从base64写入文件并使用fs模块再次读取它来实现此成就,但我相信这不是正确的方法。

问题的关键是,1.在这种情况下如何正确发送base64编码的字符串作为ReadStream对象2.我怎样才能清楚地弄清楚缓冲区和dataview(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 获取吗?

最佳答案

试试这个

  //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 );

关于javascript - 按文件从 Base64 编码字符串创建 ReadStream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48534404/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com