使用 multer 传递 memoryStorage 以表示与 ajax 但 req.file 未定义



我知道这里有很多帖子在堆栈溢出中询问req.file没有定义,我浏览了相当多的帖子,其中大多数都是命名,我不认为这是我如何得到未定义的。

这是我的 html (pug( 我没有使用表单,因为我只是使用更改的输入

input#avatar-file(type='file', name='avatar')
button#add-avatar-btn.btn.btn-info Add Avatar

我的阿贾克斯

s = {
onClick: () => {
$('#add-avatar-btn').on('click', function (e) {
e.preventDefault();
$('#avatar-file').click();
});
},
onChange: () => {
$('#avatar-file').on('change', function (e) {
e.stopPropagation();
e.preventDefault();
let file = e.target.files;
if (file.length === 1) {
let formData = new FormData();
formData.append('avatar', file);
console.log(formData, 'formdata');  // this gives me -> FormData {} "formdata"
s.runAjax(formData);
}
});
},
runAjax: dataValue => {
$.ajax({
method: 'post',
url: '/avatar/upload',
data: dataValue,
contentType: false,
processData: false,
success: data => {
console.log(data, 'data success return');
},
error: err => {
console.log(err, 'err return ');
}
});
},
};
s.onClick();
s.onChange();

我的快递部分

const multer  = require('multer');
const storage = multer.memoryStorage();
const upload = multer({ storage: storage });
router.post('/avatar/upload',  upload.single('avatar'), async (req, res, next) => {
try {
console.log(req.body.avatar, 'req.body.avatar');  // { avatarUrl: '[object FileList]' } 'req.body'
console.log(req.files, 'request files');  // undefined
console.log(req.file, 'single file');  // undefined
return res.json({status: true});
} catch (err) {
return next(err);
}
});

不过,我做错了哪一部分? 我实际上正在尝试使用内存存储,以便它存储为缓冲区,然后将其上传到 s3,而不是在本地保存图像。

但我被困在这里。

提前感谢任何帮助。

它不起作用,因为您发送的是数组而不是文件。

formData.append('avatar', file[0]);

而不是

formData.append('avatar', file);

最新更新