Node.js将二进制文件转换为utf8

jrcvhitl  于 2022-12-12  发布在  Node.js
关注(0)|答案(2)|浏览(284)

我有一个jrmxl(碧玉reports)文件以二进制格式(bytea)存储在postgresql数据库中,我试图读取该文件并将其转换为普通的jrmxl(XML)文件,然后将其保存在磁盘上。
这是我目前所做的尝试

var fs = require('fs');
exports.saveFile = function (pg) {
  //pg is the postgres connection to query the db
  pg.query('Select data from data_file where id = 123', function (err, result) {
    if (err) {
      console.log(err);
      return;
    }

    var data = result.rows[0].data;

    //Buffer.isBuffer(data) === true

    // I can get the data here. Now I try to convert it into text
    var file = data.toString('utf8');

    fs.writeFile('report.jrxml',file, function (er) {
      if (er) {
        console.log('an error occurred while saving the file');
        return;
      }
      console.log('file saved');
    }} 
  });
}

如果我运行上面的代码,文件被保存,但不知何故它是二进制的。我如何将它转换为一个纯xml文件的文本格式,我可以导入到例如ireport?

jv4diomz

jv4diomz1#

您可以尝试先通过一个缓冲区。我已经使用这种技术将DB BLOB转换为base64字符串。

var fileBuffer = new Buffer( result.rows[0].data, 'binary' );
var file = fileBuffer.toString('utf8');
iaqfqrcu

iaqfqrcu2#

我使用“pako”npm包来解决该问题:

import { connection, Message } from 'websocket';
import * as pako from 'pako';

protected async onCustomMessage(message: Message, con): Promise<void> {
    let data;
    let text;
    if (message.type === 'utf8') {
      // console.log("Received UTF8: '" + message.utf8Data + "'");
      text = message.utf8Data;
      data = JSON.parse(text);
    } else {
      const binary = message.binaryData;

      text = pako.inflate(binary, {
        to: 'string',
      });
      data = JSON.parse(text);
    }
}

npm i pako && npm i -D @类型/包

相关问题