【发布时间】:2019-07-04 08:34:28
【问题描述】:
当我使用 Multer for NodeJS 通过 HTTP 接收文件时, req.file 对象未定义。我可以看到文件最终位于正确的文件夹中,但名称很乱。不确定它是否相关,但我在 Ubuntu 上使用 Apache2。
var express = require('express');
var app = express();
var fs = require('fs');
var multer = require('multer');
var upload = multer({ dest: 'uploads/' })
var bodyParser = require('body-parser');
app.use(express.static('public'));
app.use(bodyParser.urlencoded({ extended: false }));
app.use(multer({dest: '/var/www/185.86.150.191/uploads'}).any());
app.get('/index.html', function (req, res) {
res.sendFile( __dirname + "/" + "index.html" );
})
app.post('/file_upload', upload.single('file'), function (req, res) {
console.log(req.baseURL)
console.log(req.path)
console.log(req.file.name);
console.log(req.file.path);
console.log(req.file.type);
var file = __dirname + "/" + req.file.name;
fs.readFile( req.file.file.path, function (err, data) {
fs.writeFile(file, data, function (err) {
if( err ) {
console.log( err );
} else {
response = {
message:'File uploaded successfully',
filename:req.file.file.name
};
}
console.log( response );
res.end( JSON.stringify( response ) );
});
});
})
整个对象不是未定义的。我可以毫无问题地访问 req.path,但是应用程序在到达 req.file.name 时会崩溃,因为 req.file 未定义。
TypeError:无法读取未定义的属性“名称” 在/home/asgeir/nodejs/first_test_app/server.js:20:24 在 Layer.handle [as handle_request] (/home/asgeir/nodejs/first_test_app/node_modules/express/lib/router/layer.js:95:5) 在下一个(/home/asgeir/nodejs/first_test_app/node_modules/express/lib/router/route.js:137:13) 在立即。 (/home/asgeir/nodejs/first_test_app/node_modules/multer/lib/make-middleware.js:53:37) 在 Immediate.immediate._onImmediate (timers.js:440:18) 在 processImmediate [as _immediateCallback] (timers.js:383:17)
我发现的一个解决方法是将目标路径设为绝对路径,但它没有帮助。 req.file 对象仍未定义。
客户端是这样的:
<html>
<head>
<title>File Upload Testing</title>
</head>
<body>
<h3>File Upload:</h3>
Select a file to upload: <br />
<form action = "http://185.86.150.191/node/file_upload" method = "POST"
enctype = "multipart/form-data">
<input type="file" name="file" size="50" />
<br />
<input type = "submit" value = "Upload File" />
</form>
</body>
</html>
【问题讨论】:
-
您发送文件的方式可能存在问题。客户端代码是什么样的?
-
@Quentin Woops,完全忘记添加客户端了!我现在已经编辑了。
-
您是否向 Apache 发出 HTTP 请求,然后让它反向代理到 Node.js?如果您直接向 Node.js 发出请求会发生什么? (我认为这不会有帮助,但这会消除 Apache 配置问题作为可能的因素)
-
@Quentin 我正在通过 Apache 路由请求,是的。不过,我不确定如何消除该步骤,因为 NodeJS 应用程序是本地托管在仅限终端的 Linux 服务器上的。
-
在另一台计算机上运行节点代码的测试实例?从运行在终端上的 Lynx 向它发出 HTTP 请求?
标签: javascript node.js express ubuntu multer