使用node.js编写二进制数据的问题

Aka*_*wal 6 javascript binary-data fs node.js

我试图将请求的二进制体写入文件并失败.该文件是在服务器上创建的,但我无法打开它.我在Ubuntu上收到'致命错误:不是png'.以下是我提出请求的方式:

curl --request POST --data-binary "@abc.png" 192.168.1.38:8080
Run Code Online (Sandbox Code Playgroud)

以下是我试图用文件保存它的方法.第一个片段是用于将所有数据附加在一起的中间件,第二个是请求处理程序:

中间件:

app.use(function(req, res, next) {
  req.rawBody = '';
  req.setEncoding('utf-8');
  req.on('data', function(chunk) { 
    req.rawBody += chunk;
  });
  req.on('end', function() {
    next();
  });
});
Run Code Online (Sandbox Code Playgroud)

处理器:

exports.save_image = function (req, res) {
  fs.writeFile("./1.png", req.rawBody, function(err) {
    if(err) {
      console.log(err);
    } else {
      console.log("The file was saved!");
    }
  });
  res.writeHead(200);
  res.end('OK\n');
};
Run Code Online (Sandbox Code Playgroud)

这里有一些可能有用的信息.在中间件中,如果我记录rawBody的长度,它看起来是正确的.我真的很困惑如何正确保存文件.我所需要的只是朝着正确的方向努力.

Pet*_*ons 4

这是一个完整的、可以运行的 Express 应用程序。我用它打了一下curl --data-binary @photo.jpg localhost:9200,效果很好。

var app = require("express")();
var fs = require("fs");
app.post("/", function (req, res) {
  var outStream = fs.createWriteStream("/tmp/upload.jpg");
  req.pipe(outStream);
  res.send();
});
app.listen(9200);
Run Code Online (Sandbox Code Playgroud)

我只是将请求直接传送到文件系统。至于你的实际问题,我的第一个猜测是req.setEncoding('utf-8');utf-8 适用于文本数据而不是二进制数据。