req.file 未使用 multer 定义
req.file is undefined using multer
我正在为 运行 二十一点游戏设置服务器,我想在后端使用 multer 将个人资料图片存储在 amazon S3 上。但是,每当我尝试将图像从前端发送到后端时,我的 req.file 是未定义的。
很多帖子都有这个问题,但是我已经做了他们说的大部分,但都无济于事。
我的HTML输入:
<fieldset>
<legend>Create Account</legend>
Username:<input type="text" id="createUser"><br>
Password:<input type="password" id="createPW"><br>
Screen Name: <input type="text" id="createScreen"><br>
Profile Picture: <input type="file" enctype="multipart/form-data" id="avatar" name="avatar" accept="image/png, image/jpeg">
<button id="createAccountButton">Submit</button>
</fieldset>
我的前端获取(纯 js):
fetch(ec2+"/image-upload", {method: "POST", body: file}).then(checkStatus).catch(function(e){console.log(e);});
我的后端:
server.js
const singleUpload = upload.single('avatar');
app.post('/image-upload',function(req, res) {
console.log(req.file);
singleUpload(req, res, function(err, some) {
if (err) {
return res.status(422).send({errors: [{title: 'Image Upload Error', detail: err.message}] });
}
return res.json({'imageUrl': req.file.location});
});
})
上传:
var upload = multer({
storage: multerS3({
s3: s3,
bucket: 'cloud-bj-bucket',
acl: 'public-read',
metadata: function (req, file, cb) {
cb(null, {fieldName: 'TESTING_METADATA'});
},
key: function (req, file, cb) {
cb(null, file.filename);
}
})
})
错误在后端部分
编辑:
这是我如何从 html
获取图像
var file = document.getElementById("avatar").files[0];
fetch(ec2+"/image-upload", {method: "POST", body: file}).then(checkStatus).catch(function(e){console.log(e);});
这是因为您试图在执行 upload.single
之前访问 req.file
。只需像这样链接中间件:
const singleUpload = upload.single('avatar');
app.post('/image-upload', singleUpload, function(req, res) { // <-- mount it here
console.log(req.file)
// rest of the code
}
您可以使用 FormData
设置正确的 headers 并在您的提取调用中使用它。但是,您需要一个表单元素。
var file = document.getElementsByTagName("form");
var data = new FormData(file)
fetch(ec2+"/image-upload", {
method: "POST",
body: data
})
最简单的选择是拥有表单元素并直接调用 api 而无需 fetch
参与:
<form action="/image-upload" method="POST" enctype="multipart/form-data">
<fieldset>
<legend>Create Account</legend>
Username:<input type="text" id="createUser">
Password:<input type="password" id="createPW">
Screen Name: <input type="text" id="createScreen">
Profile Picture: <input type="file" id="avatar" name="avatar" accept="image/png, image/jpeg">
<button type="submit" id="createAccountButton">Submit</button>
</fieldset>
</form>
我正在为 运行 二十一点游戏设置服务器,我想在后端使用 multer 将个人资料图片存储在 amazon S3 上。但是,每当我尝试将图像从前端发送到后端时,我的 req.file 是未定义的。
很多帖子都有这个问题,但是我已经做了他们说的大部分,但都无济于事。
我的HTML输入:
<fieldset>
<legend>Create Account</legend>
Username:<input type="text" id="createUser"><br>
Password:<input type="password" id="createPW"><br>
Screen Name: <input type="text" id="createScreen"><br>
Profile Picture: <input type="file" enctype="multipart/form-data" id="avatar" name="avatar" accept="image/png, image/jpeg">
<button id="createAccountButton">Submit</button>
</fieldset>
我的前端获取(纯 js):
fetch(ec2+"/image-upload", {method: "POST", body: file}).then(checkStatus).catch(function(e){console.log(e);});
我的后端: server.js
const singleUpload = upload.single('avatar');
app.post('/image-upload',function(req, res) {
console.log(req.file);
singleUpload(req, res, function(err, some) {
if (err) {
return res.status(422).send({errors: [{title: 'Image Upload Error', detail: err.message}] });
}
return res.json({'imageUrl': req.file.location});
});
})
上传:
var upload = multer({
storage: multerS3({
s3: s3,
bucket: 'cloud-bj-bucket',
acl: 'public-read',
metadata: function (req, file, cb) {
cb(null, {fieldName: 'TESTING_METADATA'});
},
key: function (req, file, cb) {
cb(null, file.filename);
}
})
})
错误在后端部分
编辑: 这是我如何从 html
获取图像var file = document.getElementById("avatar").files[0];
fetch(ec2+"/image-upload", {method: "POST", body: file}).then(checkStatus).catch(function(e){console.log(e);});
这是因为您试图在执行 upload.single
之前访问 req.file
。只需像这样链接中间件:
const singleUpload = upload.single('avatar');
app.post('/image-upload', singleUpload, function(req, res) { // <-- mount it here
console.log(req.file)
// rest of the code
}
您可以使用 FormData
设置正确的 headers 并在您的提取调用中使用它。但是,您需要一个表单元素。
var file = document.getElementsByTagName("form");
var data = new FormData(file)
fetch(ec2+"/image-upload", {
method: "POST",
body: data
})
最简单的选择是拥有表单元素并直接调用 api 而无需 fetch
参与:
<form action="/image-upload" method="POST" enctype="multipart/form-data">
<fieldset>
<legend>Create Account</legend>
Username:<input type="text" id="createUser">
Password:<input type="password" id="createPW">
Screen Name: <input type="text" id="createScreen">
Profile Picture: <input type="file" id="avatar" name="avatar" accept="image/png, image/jpeg">
<button type="submit" id="createAccountButton">Submit</button>
</fieldset>
</form>