如何在对象 nodejs/multer 中接收上传的文件
How to receive uploaded file within object nodejs/multer
我有一个更改用户个人资料头像页面..我正在使用 XHR 上传图片..然后使用 multer(后端)接收它。
我面临的问题是接收到的数据是空的,因为我在里面发送图片和对象
var loadFile = function(event) {
//avatar file
let file = event.target.files[0];
let formData = new FormData();
formData.append('userAvatarFile', file);
customAjax({
method: 'post',
route: '/profileEdit/userAvatar',
type: "multipart/form-data",
data: {
target: formData //the avatar file is inside this "data" object
})
};
问题: 如您所见,我将 'formData' 放入一个对象中,但是当我这样做时,multer 将找不到该文件,并且必须发送像那样的 formData .. 我怎样才能让 multer 从 'data' 对象内部读取文件?
后端部分:
//SET DESTINATION AND FILE NAME FOR THE UPLOADED IMAGES
const storage = multer.diskStorage({destination: __dirname +
'/../views/resources/images/avatar',
filename: function(req, file, cb){
cb(null, file.fieldname + '-' + Date.now() + path.extname(file.originalname));
}});
//init upload for multer
const upload = multer({storage: storage,
limits: {
fileSize: 1000000
},
fileFilter: function(req, file, cb){
checkFileType(file, cb);
}
}).single('userAvatarFile');
//SECURITY PART OF FILE UPLOADING
//check the uploaded files
function checkFileType(file, cb){
//Allowed ext
const filetypes = /jpeg|jpg|png|gif/;
//check ext
const extname= filetypes.test(path.extname(file.originalname).toLowerCase());
//check mime
const mimetype = filetypes.test(file.mimetype);
if(mimetype && extname){
return cb(null, true);
}else{
return cb(new Error('Images Only!'))
}
}
在解决 OP 的问题时,似乎所有 xhr
都已合并到一个函数中以简化所有请求。但是数据在发送前经过了JSON.stringify
的转换,这不是"multipart/form-data"
应该做的。
"multipart/form-data"
用于处理 blob,如果没有一些妥协(例如编码 base64 或其他编码,这会导致更大的大小),普通 HTTP 无法真正处理 blob。 "multipart/form-data"
基本上是流式上传,因此会有块加载到您的服务器。 Multer
就是用来处理这个的。
您可以在此处阅读有关 "multipart/form-data"
的更多信息
https://developer.mozilla.org/en-US/docs/Learn/Forms/Sending_and_retrieving_form_data
我有一个更改用户个人资料头像页面..我正在使用 XHR 上传图片..然后使用 multer(后端)接收它。 我面临的问题是接收到的数据是空的,因为我在里面发送图片和对象
var loadFile = function(event) {
//avatar file
let file = event.target.files[0];
let formData = new FormData();
formData.append('userAvatarFile', file);
customAjax({
method: 'post',
route: '/profileEdit/userAvatar',
type: "multipart/form-data",
data: {
target: formData //the avatar file is inside this "data" object
})
};
问题: 如您所见,我将 'formData' 放入一个对象中,但是当我这样做时,multer 将找不到该文件,并且必须发送像那样的 formData .. 我怎样才能让 multer 从 'data' 对象内部读取文件?
后端部分:
//SET DESTINATION AND FILE NAME FOR THE UPLOADED IMAGES
const storage = multer.diskStorage({destination: __dirname +
'/../views/resources/images/avatar',
filename: function(req, file, cb){
cb(null, file.fieldname + '-' + Date.now() + path.extname(file.originalname));
}});
//init upload for multer
const upload = multer({storage: storage,
limits: {
fileSize: 1000000
},
fileFilter: function(req, file, cb){
checkFileType(file, cb);
}
}).single('userAvatarFile');
//SECURITY PART OF FILE UPLOADING
//check the uploaded files
function checkFileType(file, cb){
//Allowed ext
const filetypes = /jpeg|jpg|png|gif/;
//check ext
const extname= filetypes.test(path.extname(file.originalname).toLowerCase());
//check mime
const mimetype = filetypes.test(file.mimetype);
if(mimetype && extname){
return cb(null, true);
}else{
return cb(new Error('Images Only!'))
}
}
在解决 OP 的问题时,似乎所有 xhr
都已合并到一个函数中以简化所有请求。但是数据在发送前经过了JSON.stringify
的转换,这不是"multipart/form-data"
应该做的。
"multipart/form-data"
用于处理 blob,如果没有一些妥协(例如编码 base64 或其他编码,这会导致更大的大小),普通 HTTP 无法真正处理 blob。 "multipart/form-data"
基本上是流式上传,因此会有块加载到您的服务器。 Multer
就是用来处理这个的。
您可以在此处阅读有关 "multipart/form-data"
的更多信息
https://developer.mozilla.org/en-US/docs/Learn/Forms/Sending_and_retrieving_form_data