【问题标题】:Why is request.file always undefined when using Multer?为什么使用 Multer 时 request.file 总是未定义?
【发布时间】: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


【解决方案1】:

我认为应该是req.files 而不是req.file

【讨论】:

  • 我检查了文档。使用upload.single 时为file,单数。
  • @Quentin 我认为您不需要添加该代码。因为你设置了 .any(),所以它在 req.files 中已经准备好了
【解决方案2】:

我已经编写了示例示例,请查看上面的示例,希望对您有所帮助。

var multer = require('multer');
var upload = multer({dest: 'uploads/'});

app.post('/upload', upload.single(), function (req, res) {
 console.log(req.file)
})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-04
    • 1970-01-01
    • 2020-11-01
    • 1970-01-01
    • 2017-01-26
    • 2022-01-16
    相关资源
    最近更新 更多