如何在使用stream2接口后将node.js缓冲区转换为可读流?
我已经找到了这个答案和stream-buffers模块,但是这个模块基于stream1接口.
根据文档 https://nodejs.org/api/fs.html#fs_fs_createreadstream_path_options
fs.createReadStream()可以接受Buffer作为第一个参数
我的节点代码:
var _ = require('lodash')
var faker = require('faker')
var http = require('http')
var fs = require('fs')
var xlsx = require('node-xlsx')
var gg = _.range(10).map((item) => {
return _.range(10).map((item) => {
return faker.name.findName()
})
})
http.createServer(function(req, res) {
var buf = xlsx.build([{
name: 'sheet1',
data: gg
}])
fs.createReadStream(buf, 'binary').pipe(res)
}).listen(9090)
Run Code Online (Sandbox Code Playgroud)
但我得到这个错误:
events.js:160
throw er; // Unhandled 'error' event
^
Error: Path must be a string without null bytes
at nullCheck (fs.js:135:14)
at Object.fs.open (fs.js:627:8)
at ReadStream.open (fs.js:1951:6) …Run Code Online (Sandbox Code Playgroud) 是否可以调用pdftotext,antiword,catdoc(文本提取器脚本)等CLI工具传递字符串而不是文件?
目前,我阅读了调用pdftotext的PDF文件child_process.spawn.我生成一个新进程并将结果存储在一个新变量中.一切正常.
我想传递binary一个fs.readFile而不是文件本身:
fs.readFile('./my.pdf', (error, binary) => {
// Call pdftotext with child_process.spawn passing the binary.
let event = child_process.spawn('pdftotext', [
// Args here!
]);
});
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
我需要使用formData将pdf发送到api。我下载的 pdf 在记录时看起来像这样:<Buffer 6d 61 67 65 49 2f ... >
如果我fs.writeFileSync是完全可读的。但我想尝试将它传递给 api 而不必用fs, 来编写它,以将 pdf 作为缓冲区进行操作。我的帖子看起来像这样:
const formData = new FormData();
formData.append('access_key', this.config.redacted);
formData.append('redacted','redacted');
formData.append('file', fs.createReadStream('./filename.pdf'));
return post('urlRedacted', formData, {
headers: formData.getHeaders(),
})
Run Code Online (Sandbox Code Playgroud)
这个请求会成功,但它需要我用 编写文件fs,我想避免这种情况。我尝试了一些方法,例如使用库node-streamifier来帮助我从缓冲区创建可读流,但是 api 向我发送了一个错误:{ error: 'Invalid parameter \'file\' or \'bucket\': Object expected' }.
所以我的问题是,如何重现fs.createReadStream行为,这似乎是唯一适用于我的用例的行为?
注意:我尝试像这样实现 此解决方案:formData.append('file', createReadStream(myBuffer))并且像这样formData.append('file', createReadStream(myBuffer,{ encoding: 'binary' }))但没有对错误进行任何更改。
解决方案:
fs 正在流式传输数据并智能地从它正在读取的文件中添加一些信息,因此在数据流的开头提供了这一行:
_streams:
[ '----------------------------622545709057705753853273\r\nContent-
Disposition: …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 Multer 和 Papa Parse 在 NestJS 中处理 CSV 文件。我不想将文件存储在本地。我只想解析 CSV 文件以提取一些信息。
但是,我无法处理它,我尝试了两种不同的方法。在第一个中,我将文件缓冲区传递给 Papa.parse 函数。但是,我收到错误: ReferenceError:FileReaderSync 未定义
@Post('1')
@UseInterceptors(
FileInterceptor('file', {})
)
async uploadFile(@UploadedFile() file: Express.Multer.File ){
const csvData = papa.parse(file.buffer, {
header: false,
worker: true,
delimiter: ",",
step: function (row){
console.log("Row: ", row.data);
}
});
}
Run Code Online (Sandbox Code Playgroud)
因此尝试调用 readFileSync() 如下所示,但是这次我收到错误,ERROR [ExceptionsHandler] ENAMETOOLONG: name too long, open
@Post('2')
@UseInterceptors(
FileInterceptor('file', {})
)
async uploadFile(@UploadedFile() file: Express.Multer.File ){
const $file = readFileSync(file.buffer);
const csvData = papa.parse($file, {
header: false,
worker: true, …Run Code Online (Sandbox Code Playgroud) node.js ×4
pdf ×2
buffer ×1
csv ×1
file-upload ×1
javascript ×1
nestjs ×1
papaparse ×1
stream ×1
text ×1