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

时间:2014-03-19 12:51:45

标签: javascript node.js fs binary-data

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

curl --request POST --data-binary "@abc.png" 192.168.1.38:8080

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

中间件:

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();
  });
});

处理程序:

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');
};

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

2 个答案:

答案 0 :(得分:4)

这是一个完整的快速应用程序。我用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);

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

答案 1 :(得分:0)

为了修复您的代码:我使用 @Peter Lyons ,错误可能是req.setEncoding('utf-8');行。

我知道以下内容并未直接提出您的问题,但建议使用您正在使用的 Express.js 提供的req.files功能替代它。< / p>

if(req.files.photo&amp;&amp; req.files.photo.name){     //获取文件的临时位置。     var tmp_path = req.files.photo.path;

// set where the file should actually exists - in this case it is in the "images" directory.
var target_path = './public/profile/' + req.files.photo.name;

// Move the file from the temporary location to the intended location.
fs.rename(tmp_path, target_path, function (error) {
    if (!error) {
        /*
         * Remove old photo from fs.
         * You can remove the following if you want to.
         */
        fs.unlink('./public/profile/' + old_photo, function () {
            if (error) {
                callback_parallel(error);
            }
            else {
                callback_parallel(null);
            }
        });
    }
    else {
        callback_parallel(error);
    }
});

}