req.file 在我的 Node Express 应用程序中始终使用 multer 未定义



我尝试在multer-s3的支持下使用multer将图像文件从客户端上传到我的AWS S3存储服务器。但是,我的 req.file 调用不断得到未定义的结果。我一直在谷歌搜索并检查我的问题的所有可能原因,到目前为止没有运气。希望有人能在这里帮助我。提前谢谢。

客户端 HTML 代码:

<form method="post" enctype="multipart/form-data" action="/create">
<input type="text" name="name" />
<input type="text" name="topic" />
<input type="file" name="image" />
<input type="submit" value="Upload" />
</form>

服务器端代码:

var express = require('express');
var http = require('http');
var app = express();
var methodOverride = require('method-override');
var bodyParser = require('body-parser');
var multer  = require('multer');
var multerS3 = require('multer-s3');
var AWS = require('aws-sdk');
app.use(methodOverride());
app.use(bodyParser.urlencoded({ extended: true }));
//Create S3 client
var s3 = new AWS.S3();
//this code is copy directly from multer-s3 since I don't care about my file name shown on S3 for now
var upload = multer({
storage: multerS3({
s3: s3,
bucket: mybuckname,
metadata: function (req, file, cb) {
cb(null, {fieldName: file.fieldname});
},
key: function (req, file, cb) {
cb(null, Date.now().toString())
}
})
});
app.post('/create', upload.single('image'), function(req, res) {
var nameField = req.body.name,
topicField = req.body.topic;
console.log("File: ", req.file);
console.log("Name: ", nameField);
console.log("Topic: ", topicField);
res.sendStatus(200);
res.end();
});

我尝试了以下方法:

  1. 删除了"body-parser"并仅使用"multer",然后结果更糟(req.body 和 req.file 都是未定义的)。使用身体解析器,至少我可以保证 req.body 正在工作
  2. 为了简化原因,我从客户端删除了所有文本字段输入,只留下文件上传选项,以确保我只传输文件数据,仍然返回 req.file 的未定义(multer 根本不工作)
  3. 我还读到了"请注意,req.body 可能尚未完全填充。这取决于客户端将字段和文件传输到服务器的顺序。就我而言,我没有收到文件,所以现在对我来说无关紧要。
  4. 只使用 multer
  5. 而不使用 multer-s3,并尝试使用 upload.array 而不是 upload.single,仍然没有运气(multer-s3 建立在 multer 之上,所以我认为它与我目前的问题没有任何关系,但只是试一试)
  6. 跳过 AWS S3 并将其存储在本地路径中,结果仍未定义

经过长时间的斗争,在multer和busboy之间切换,没有任何效果。突然间,我注意到我的表单实际上使用了聚合物元素"is="铁形式",我的错误没有在我的原始帖子中键入它,如下所示。删除它后,我的文件上传可以在 multer 上运行 - 我相信它也可以在 busboy 上运行。

<form is="iron-form" method="post" enctype="multipart/form-data" action="/create"> 

过去,聚合物元素总是给我带来问题。但不要误会我的意思,这是一个很棒的项目,有很多很棒的东西可用于设计你的页面。但是您需要真正了解如何使用这些元素来利用它们。就我而言,我从我的教训中吸取教训,并希望与您分享。

最新更新