javascript - 在 Node.js 中更新二进制文件

标签 javascript node.js file express binaryfiles

我正在尝试使用 Node.js 处理二进制文件。

我正在尝试从客户端接收二进制文件,打开二进制文件,转换为十六进制,替换数据并将新的二进制文件返回给客户端。

app.use('/read-binary-file',(req,res) => {
    try {
        let content = fs.readFileSync(file_path);
        console.log('content', content)
        res.status(200).send({content})
    }
    catch(err) {
        console.error(err);
    }
})

我编写了获取现有文件并尝试读取它的代码。当我打印它时,我在缓冲区中得到这个:

content <Buffer 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ... >

我不确定如何将它转换为十六进制然后尝试更改它... 当我通过在线十六进制编辑器读取文件时,每行 16 位,这种方式非常舒服。

Enter image description here

我有一些问题:

  1. 如何将二进制转换为十六进制?
  2. 如何替换十六进制文件中的数据,然后返回给客户端?
  3. 如何在代码中将它们显示为 16 位?
  4. 将它们存储在数据库中的最佳方式是什么?存储文件然后 在数据库中只存储路径?

是否有任何文档可以提供帮助?

最佳答案

  1. 二进制转十六进制:

    const file = fs.readFileSync("./test");
    const str = file.toString("hex");
    
  2. 替换数据返回给客户端:

    let newStr = str.replace( "00", "FF" );
    let buffer = Buffer.from( newStr, "hex" );
    
  3. 以 16 位显示:

    for ( let i = 0; i < newStr.length; i+=16 ){
      console.log( newStr.slice( i, i+16 ) + "\n" );
    }
    
  4. 将文件保存在可写的上传文件夹中,并将上传文件的URL路径保存在数据库中。这是我的建议,根据我的经验。您可以在这篇 Quora 帖子中阅读有关是否要选择将图像存储在数据库中(以 BLOB 格式)的更多信息: Is it a bad design to store images as blobs in a database?


以下是可能对您有所帮助的基本设置:

/测试

ABC

/app.js

const express = require('express');
const app = express();
const fs = require('fs');

app.use("/test", (req, res) => {

    const file = fs.readFileSync("./test");     // Read file as binary
    const str = file.toString("hex");           // Convert to hexadecimal
    let newStr = str.replace(/41|43/g, "42");   // Replace hexadecimal characters
    let buffer = Buffer.from(newStr, "hex");    // Create buffer from hexadecimal

    // Send to the user as download
    res.setHeader('Content-disposition', 'attachment; filename=test-edited.txt');
    res.setHeader('Content-type', 'text/plain');
    res.charset = 'UTF-8';
    res.write(buffer);
    res.end();
});

app.listen(3000, () => console.log('Server Running...'));

测试文件包含字符 ABC。它们被转换为 BBB,然后被下载。

您可以通过设置适当的文件名和MIME type来选择输出不同的文件类型。 (内容类型),例如用于下载 PNG图片:

    res.setHeader('Content-disposition', 'attachment; filename=output.png');
    res.setHeader('Content-type', 'image/png');

注意:对于直接二进制操作,无需中间的十六进制转换,请参见 Christos Lytras' answer .

关于javascript - 在 Node.js 中更新二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60243428/

相关文章:

node.js - 反序列化用户,序列化用户未被调用,passportjsexpress

node.js - 如何运行多个 Firebase Promise,然后一旦完成,执行函数

c++ - 从文件中读取数据

java - 脚本语言和编译语言

javascript - 带有 ajax 的 onBeforeUnload 不适用于 IE

javascript - Jquery:如何在函数内部存储变量并在外部使用它?

javascript - 如何改善 OpenCV 两幅图像的背景下降

c# - 向文件添加文本显示在一长行中

perl - 使用 Perl 同时创建 ZIP 存档和文件

javascript - 稍后如何在我的页面中使用 JavaScript 或 HTML 引用 Razor 变量