NodeJS&角度图像上传

时间:2017-01-05 20:53:46

标签: angularjs node.js multer ng-file-upload

尝试过很多可用的互联网教程,但我仍然无法使其正常运行。我在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);
        });

我试过邮差:

Postman request SS

并收到此错误:

“错误:ENOENT:没有这样的文件或目录,打开'c:\ Users \ Username \ Desktop \ APP \ APP_FRONT \ images \ header \ header.jpg'”

当我从客户端尝试时,我收到了这些错误:

错误:makeError错误的字段” 和 “ TypeError:dbg未定义

我已经咨询了谷歌,尝试了一些教程但却陷入了困境。

2 个答案:

答案 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);
    }

现在一切都好。但现在,问题是,为什么自定义文件名不起作用?