在 Node.js 服务器上通过 fs 创建文件时出错

Error while creating file by fs on Node.js server

我有一个 Node.js 服务器,我正在尝试通过将 bmp 图像上传到服务器来解析验证码。我面临两个问题。

  1. 图片上传不正确。当我尝试打开图像时,出现错误 "BMP image has bogus header data".

  2. 目前我正在从上传的数据中读取缓冲区并解析它以提取验证码字符串。验证码字符串是任意的(结果显示正确的最后 3 个字符而不是 6 个)。

这是我正在使用的代码:

app.use (function(req, res, next) {
    console.log("statrt");  
    var data="";
    req.on('data', function(chunk) { 
        data += chunk;
    });
    req.on('end', function() {
        console.log("end"); 
        req.body = data;
        next();
    });
});

var DoneInSync = fibrous(function(buffer){
    var val = captcha.getCaptcha(buffer);
    console.log("this" + val);  
    return val;
});

app.post('/', function (req,res){

    buffer = new Buffer(req.body);
    fs.writeFileSync("captchas_ass.bmp", buffer);
    var val = DoneInSync.sync(buffer);
    res.write("Yoing -> " + val);
    res.end();

});

验证码解析器代码运行完美,并通过离线测试。

我面临的主要问题是将 BMP 文件上传到服务器。完成后我可以这样做

var buf = fs.readFileSync("captcha.bmp");

并将 buf 传递给 captcha.getCaptcha(buf) 并得到结果。

谁能解释一下上传哪里错了?

您的中间件正在将传入数据字符串化,这是不应该的。试试这个:

app.use (function(req, res, next) {
  var data = [];
  req.on('data', function(chunk) { 
    data.push(chunk);
  });
  req.on('end', function() {
    console.log("end"); 
    req.body = Buffer.concat(data); // `req.body` will be a Buffer
    next();
  });
});

这仅在您将数据作为 "raw" POST 请求上传时才有效。如果您使用 multipart/formdata 之类的东西,这也不起作用。为此你应该使用像 multer.

这样的中间件