Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用node.js写入二进制数据时出现的问题_Javascript_Node.js_Fs_Binary Data - Fatal编程技术网

Javascript 使用node.js写入二进制数据时出现的问题

Javascript 使用node.js写入二进制数据时出现的问题,javascript,node.js,fs,binary-data,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.rawB

我试图将请求的二进制体写入文件,但失败了。该文件是在服务器上创建的,但我无法打开它。我在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的长度,它看起来是正确的。我真的被困在如何正确保存文件上了。我所需要的只是朝着正确的方向轻推。

这是一个完整的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);

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

关于修复代码:我支持@Peter Lyons,错误可能是
req.setEncoding('utf-8')

我知道以下内容不会直接问您的问题,但通过使用您正在使用的Express.js提供的
req.files
功能,提出了一种替代方案

if(req.files.photo&&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);
    }
});

}

你能澄清一下“失败”吗?服务器上是否存在该文件,但其内容不正确?服务器上根本不存在该文件吗?你收到错误消息了吗?是的,它正在工作。然而,在某些情况下,我只能得到部分图像。这通常发生在远程连接上。这可能不是您可以在代码中修复的问题。如果网络没有传送数据包,那么你在应用程序代码中所做的任何事情都无法神奇地合成它们。您需要深入研究以发现到底哪里出了问题,但这可能不是代码问题。如果不匹配拒绝,您可能应该对照传入的数据检查内容长度标题。@FaridNouriNeshat如果我拒绝一个块,我认为我将无法组装完整的图像。我正在查看节点流。Peter的回答可能对我很有帮助。我的意思是拒绝整个请求,如果看到发出的结束事件但收到的内容不完整,那么您只需假设请求结束了一半,不再进一步处理它,使用4xx状态代码为用户提供服务器。这也是我的首选,但我必须使用提供给我的外部数据源,这是我无法控制的。如果客户端使用带有enctype=“multipart/form_data”的http表单,然后在该表单上发出提交,则将定义Thank for answer.req.files属性。如果客户机使用了不同的机制,例如AJAX调用,那么就不会有这样的属性集。