我试图将请求的二进制体写入文件并失败。该文件是在服务器上创建的,但我无法打开它。我在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('OKn');
};
这里有一些信息可能会有帮助。在中间件中,如果我记录rawBody的长度,它看起来是正确的。我真的被如何正确地保存文件卡住了。
这是一个完整的快递应用程序。我用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
功能来提出替代方案,你正在使用。
。照片,,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);
}
});
}