Javascript 使用node.js写入二进制数据时出现的问题
我试图将请求的二进制体写入文件,但失败了。该文件是在服务器上创建的,但我无法打开它。我在Ubuntu上看到了“致命错误:不是png”。以下是我提出请求的方式: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
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调用,那么就不会有这样的属性集。