如何从缓冲区中提取文件内容?

Posted

技术标签:

【中文标题】如何从缓冲区中提取文件内容?【英文标题】:How to extract file contents from a Buffer? 【发布时间】:2019-09-10 14:02:25 【问题描述】:

我只是在探索 Node.js,在创建使用 multer 模块将小文件上传到内存的功能时遇到了一个问题。

我正在为multer 使用内置的MemoryStorage 选项。文件上传成功,文件元数据可以在ExpressJSreq对象中访问。

现在我希望能够从 Buffer 中读取文件内容,因为该文件将采用 .csv 格式,稍后将转换为 JSON。我需要文件的字符串内容来执行转换。

这是我的路由器处理程序:

const memStorage = multer.memoryStorage();
const memUpload = multer(
  storage: memStorage,
  limits:  fileSize: 30 * 1024 * 2014, files: 1 
);
router.post(
  '/tables/csv',
  memUpload.single('file'),
  (req, res) => 
    const file = req.file;
    let buffer = fs.readFileSync(file.buffer);
    console.log(buffer);
  
);

使用的.csv文件:

Risk Category,Risk ID,Risk Value
Some,Some,Some
Some,Some,Some
Some,Some,Some

控制台输出:

Error: ENOENT: no such file or directory, open 'Risk Category,Risk ID,Risk Value
Some,Some,Some
Some,Some,Some
Some,Some,Some'
    at Object.openSync (fs.js:436:3)
    at Object.readFileSync (fs.js:341:35)
    at router.post (C:\client_projects\tt\sarcs-hotline\router\index.js:1039:21)
    at Layer.handle [as handle_request] (C:\client_projects\tt\sarcs-hotline\node_modules\express\lib\router\layer.js:95:5)
    at next (C:\client_projects\tt\sarcs-hotline\node_modules\express\lib\router\route.js:137:13)
    at Array.<anonymous> (C:\client_projects\tt\sarcs-hotline\node_modules\multer\lib\make-middleware.js:53:37)
    at listener (C:\client_projects\tt\sarcs-hotline\node_modules\on-finished\index.js:169:15)
    at onFinish (C:\client_projects\tt\sarcs-hotline\node_modules\on-finished\index.js:100:5)
    at callback (C:\client_projects\tt\sarcs-hotline\node_modules\ee-first\index.js:55:10)
    at IncomingMessage.onevent (C:\client_projects\tt\sarcs-hotline\node_modules\ee-first\index.js:93:5)
    at IncomingMessage.emit (events.js:182:13)
    at endReadableNT (_stream_readable.js:1094:12)
    at process._tickCallback (internal/process/next_tick.js:63:19)

【问题讨论】:

【参考方案1】:

你可以在调用fs.readFileSync获取字符串时指定你的编码:

fs.readFileSync(file.buffer,  encoding: 'utf8' );

或者你不需要readFileSync。你可以打电话给buffer.toString(encoding) 喜欢

file.buffer.toString('utf8');

【讨论】:

以上是关于如何从缓冲区中提取文件内容?的主要内容,如果未能解决你的问题,请参考以下文章

如何合并 MFCC

如何从 MSIL 或 .NET PE 文件中提取资源内容

关于C#从Word文件中提取内容(包括样式文字,图片,公式,表格)等信息,解析分字段写入数据库的问题。

内存损坏问题

如何从节点中的ReadStream同步读取

如何将文件内容读入 istringstream?