我有一个从base64 enconded图像创建的缓冲区。我试图用POST发送到fs.createReadStream(..)。pipe(request(..))的服务但是得到以下错误:
Error: Path must be a string without null bytes
at nullCheck (fs.js:135:14)
at Object.fs.open (fs.js:626:8)
at ReadStream.open (fs.js:1916:6)
at new ReadStream (fs.js:1903:10)
at Object.fs.createReadStream (fs.js:1850:10)
at Promise (/Users/Sebbe/Documents/Code/leo-faq-service/lib/server/services/zendesk-service.js:120:10)
[...]
fs.createReadStream()接受字符串或缓冲区。如果它是一个字符串,那么它应该是一个文件的路径。在我看来,fs.createReadStream()试图将参数解析为包含路径的字符串,即使它是一个缓冲区。这可能是Nodes Buffer API中的错误吗?
更多详情:
我有一个使用Restify构建的Node服务。该服务有一个端点,它接受主题,消息,名称和base64编码的图像文件(jpg,png等)。
现在,我们希望使用Node中的JavaScript将文件内容发送到第三方服务。
当我读到这篇文章时,有几个消息来源说我应该创建一个"可读流"使用Buffer-object并将其传递给将其发送给第三方服务的请求。
因此,我从base64编码的图像创建一个Buffer,并将其作为参数发送到fs.createReadStream,然后我将其传递给请求对象。
根据这个,我应该能够从base64字符串创建一个缓冲区:https://nodejs.org/api/buffer.html#buffer_class_method_buffer_from_string_encoding
根据这个,我应该能够从缓冲区创建一个可读的流:https://nodejs.org/api/fs.html#fs_fs_createreadstream_path_options
根据这一点,我应该能够使用请求模块将缓冲区传递给POST请求:https://www.npmjs.com/package/request
来自请求模块docs的引用:
您还可以将文件流式传输到PUT或POST请求。此方法还将根据文件扩展名到内容类型(在本例中为application / json)的映射检查文件扩展名,并在PUT请求中使用正确的内容类型(如果标题尚未提供)。 / p>
fs.createReadStream(' file.json&#39)。管(request.put(URL))
_postFile(base64FileContent) {
const fileBuffer = Buffer.from(base64FileContent, 'base64');
const fileUploadOptions = this._getRequestPostFileOptions('uploads', fileBuffer.length);
return new Promise((resolve, reject) => {
fs.createReadStream(fileBuffer)
.pipe(request.post(fileUploadOptions)
.on('response', (response) => {
resolve(response);
})
.on('error', (error) => {
reject(error);
})
);
});
}
_getRequestPostFileOptions(resourceName, dataLength) {
return {
uri : url.parse(`${this.coreBaseUrl}/${resourceName}`),
timeout : RequestTimeout,
method : 'POST',
headers : {
'Authorization' : `Basic ${this.auth}`,
'Content-Type' : 'application/binary',
'Content-Length' : dataLength
}
};
}

答案 0 :(得分:0)
fs.createReadStream()
始终将文件路径作为其第一个参数。看起来你实际上是将一些二进制文件的内容作为fs.createReadStream()
的文件路径参数传递。如果我的假设是正确的,那么你应该只需要将Buffer作为正文传递给request()
,如下所示:
return new Promise((resolve, reject) => {
fileUploadOptions.body = fileBuffer;
request.post(fileUploadOptions)
.on('response', (response) => {
resolve(response);
})
.on('error', (error) => {
reject(error);
});
});