尝试过很多可用的互联网教程,但我仍然无法使其正常运行。我在NodeJS中使用 multer 模块,在AngularJS中使用 ng-file-upload 。我用multer设置了两个帮助器(因为我有两个场景,两个上传必须转到不同的文件夹)。后端文件位于APP / APP_BACK /文件夹中,因此在目标路径中,我返回一个文件夹并输入APP_FRONT / images / header。这是一个帮助器片段(/helpers/uploadHeader.js):
var storage = multer.diskStorage({
destination: function (req, file, callback) {
callback(null, '../APP_FRONT/images/header/');
},
filename: function (req, file, callback) {
var ext = filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2);
callback(null, file.fieldname + '-' + '.' + ext);
}
});
var upload = multer(
{storage: storage}
);
var helper = {
upload: upload
};
module.exports = helper;
这是路由器文件:
var headerHelper= require('../helpers/uploadHeader');
router.post('/header', headerHelper.upload.single('header'), function(req, res, next) {
headerHelper.upload(req, res, function(err){
if(err){
res.status(400).send(err);
console.log(err);
return;
}
res.status(200).send({ code:200, message:'Header upload successful!' });
});
});
“header”将是Postman中输入表单或键值的名称。
在Angular中,我在应用程序中注入了'ngFileUpload'模块,并将'Upload'服务注入到所需的控制器中,并在uploadHeader()函数中使用它,该函数绑定在客户端上的窗体内的按钮上:
$scope.uploadHeader = function (file) {
Upload.upload({
url: 'http://localhost:3003/upload/header',
method: 'POST',
file: file
}).then(function (response) {
console.log('Success ' + response.config.data.file.name + 'uploaded. Response: ' + response.data);
}, function (error) {
console.log('Error status: ' + error.status);
}, function (evt) {
var progressPercentage = parseInt(100.0 * evt.loaded / evt.total);
console.log('progress: ' + progressPercentage + '% ' + evt.config.data.file.name);
});
我试过邮差:
并收到此错误:
“错误:ENOENT:没有这样的文件或目录,打开'c:\ Users \ Username \ Desktop \ APP \ APP_FRONT \ images \ header \ header.jpg'”
当我从客户端尝试时,我收到了这些错误:
“错误:makeError错误的字段” 和 “ TypeError:dbg未定义”
我已经咨询了谷歌,尝试了一些教程但却陷入了困境。
答案 0 :(得分:1)
在你的路由器中,你告诉multer在mulitpart表单数据中寻找一个名为“header”的对象。您的angularJS代码将其添加为名为“file”的对象。
如果您更改路由器中的线路:
router.post('/header', headerHelper.upload.single(**'header'**), function(req, res, next) {
//.....
}
为:
router.post('/header', headerHelper.upload.single(**'file'**), function(req, res, next) {
//....
}
应该这样做。
答案 1 :(得分:1)
编辑:找到解决方案
实际上,在multer的storate设置中,文件名功能存在问题。在上面的帖子中,我将datetimestamp和文件扩展名附加到fieldname:
filename: function (req, file, callback) {
var datetimestamp = moment().format('DD-MM-YY_HH:mm:ss');
var filename = file.originalname;
var ext = filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2);
callback(null, file.fieldname + '-' + datetimestamp + '.' + ext);
}
由于某种原因,它无法完成上传,我收到了错误。
我更改了文件名功能,只返回文件的原始名称:
filename: function (req, file, callback) {
callback(null, file.originalname);
}
现在一切都好。但现在,问题是,为什么自定义文件名不起作用?