【问题标题】:How to pass multiple values while uploading image to server(File Upload with AngularJS and NodeJS)?将图像上传到服务器时如何传递多个值(使用 AngularJS 和 NodeJS 上传文件)?
【发布时间】:2017-01-10 12:31:23
【问题描述】:

客户端:

我已经使用 AngularJS 和 NodeJS 完成了文件上传,它正在工作,但是在上传文件时我需要将“名称”和“电子邮件”传递给服务器。

服务器端:

将文件上传到文件夹后,我需要将文件路径、名称和电子邮件保存到数据库中。我该怎么做?

angular.module('fileUpload', ['ngFileUpload'])
.controller('MyCtrl',['Upload','$window',function(Upload,$window){
    var vm = this;
    vm.submit = function(){ //function to call on form submit
        if (vm.upload_form.file.$valid && vm.file) { //check if from is valid
            vm.upload(vm.file); //call upload function
        }
    }
    
    vm.upload = function (file) {
		
		console.log(vm.name);
		console.log(vm.email);
		
		
        Upload.upload({
            url: 'http://localhost:3000/upload', //webAPI exposed to upload the file
            data:{file:file} //pass file as data, should be user ng-model
        }).then(function (resp) { //upload function returns a promise
            if(resp.data.error_code === 0){ //validate success
                $window.alert('Success ' + resp.config.data.file.name + 'uploaded. Response: ');
            } else {
                $window.alert('an error occured');
            }
        }, function (resp) { //catch error
            console.log('Error status: ' + resp.status);
            $window.alert('Error status: ' + resp.status);
        }, function (evt) { 
            console.log(evt);
            var progressPercentage = parseInt(100.0 * evt.loaded / evt.total);
            console.log('progress: ' + progressPercentage + '% ' + evt.config.data.file.name);
            vm.progress = 'progress: ' + progressPercentage + '% '; // capture upload progress
        });
    };
}]);
<script src="http://cdn.bootcss.com/danialfarid-angular-file-upload/12.2.13/ng-file-upload-shim.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular-file-upload/2.4.1/angular-file-upload.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<html>
	<head>
		<title>Home</title>
	</head>
	<body ng-app="fileUpload">
		<h1>Angular Node File Upload</h1>
        <form  ng-controller="MyCtrl as up" name="up.upload_form">
               
			name	
			<input type="text" ng-model="up.name"><br> <br>
			email	
			<input type="text" ng-model="up.email"><br> 
			Image 
            <input 
                type="file" 
                ngf-select 
                ng-model="up.file" 
                name="file" 
                ngf-max-size="20MB" 
                />
            Image thumbnail: <img style="width:100px;" ng-show="!!up.file" ngf-thumbnail="up.file || '/thumb.jpg'"/>
            <i ng-show="up.upload_form.file.$error.required">*required</i><br>
            <i ng-show="up.upload_form.file.$error.maxSize">File too large 
            {{up.file.size / 1000000|number:1}}MB: max 20M</i>
           <!--  Multiple files
            <div class="button" ngf-select ng-model="up.files" ngf-multiple="true">Select</div>
            Drop files: <div ngf-drop ng-model="up.files" class="drop-box">Drop</div> --><br> 
            <button type="submit" ng-click="up.submit()">submit</button>
            <p>{{up.progress}}</p>
        </form>
	</body>
	
</html>

后端代码:

var express = require('express'); 
var app = express(); 
var bodyParser = require('body-parser');
var multer = require('multer');

app.use(function(req, res, next) { //allow cross origin requests
    res.setHeader("Access-Control-Allow-Methods", "POST, PUT, OPTIONS, DELETE, GET");
    res.header("Access-Control-Allow-Origin", "http://localhost");
    res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
    next();
});

/** Serving from the same express Server
No cors required */
app.use(express.static('../client'));
app.use(bodyParser.json());  

var storage = multer.diskStorage({ //multers disk storage settings
    destination: function (req, file, cb) {
        cb(null, './uploads/');
    },
    filename: function (req, file, cb) {
        var datetimestamp = Date.now();
        cb(null, file.fieldname + '-' + datetimestamp + '.' + file.originalname.split('.')[file.originalname.split('.').length -1]);
    }
});

var upload = multer({ //multer settings
                storage: storage
            }).single('file');

/** API path that will upload the files */
app.post('/upload', function(req, res) {
    console.log(req.body);
    upload(req,res,function(err){
        if(err){
             res.json({error_code:1,err_desc:err});
             return;
        }
         res.json({error_code:0,err_desc:null});
    });
});

app.listen('3000', function(){
    console.log('running on 3000...');
});

我试过这样

Upload.upload({
        url: 'http://localhost:3000/upload', //webAPI exposed to upload the file
        data:{file:file, name:vm.name, email:vm.email} //pass file as data, should be user ng-model
    })

后端

app.post('/upload', function(req, res) {
        console.log(req.body);
        console.log(req.file);
      upload(req,res,function(err){
            if(err){
                 res.json({error_code:1,err_desc:err});
                 return;
            }
             res.json({error_code:0,err_desc:null});
        });
    });

在前端(角度)我得到了我在表单中输入的值但是后端(nodejs)我得到了未定义的值

【问题讨论】:

  • 你是用Cloudinary上传文件吗,也可以看看你的上传方式

标签: javascript angularjs node.js mongodb express


【解决方案1】:

您需要修改您的角度代码以发送请求数据中的额外信息

Upload.upload({
        url: 'http://localhost:3000/upload', //webAPI exposed to upload the file
        data:{file:file, name:vm.name, email:vm.email} //pass file as data, should be user ng-model
    })

然后在您的后端代码中,您可以在请求正文中引用它

req.body.name
req.body.email

【讨论】:

  • 我的控制台(后端)中未定义
  • sorry 应该是 vm.name 和 vm.email。改变了我的答案
  • 是的,我修改了仍然我得到未定义的只是
  • 你能帮帮我吗
【解决方案2】:

我不确定我的回答是否对您有所帮助。但是您可以在数据中添加姓名和电子邮件。

Upload.upload({
            url: 'http://localhost:3000/upload', //webAPI exposed to upload the file
            data:{file:file,name:"putHeretheName",email:"putHereTheMail"} //pass file as data, should be user ng-model
        }

然后在服务器端,您可以创建一个函数或使用一个查询完成您的实际“/上传”,该查询将您想要的内容保存在您的 bdd 中。您只需要获取创建的路径的名称,然后在上传成功的情况下进行保存。

也许这个例子会帮助你更多:https://www.npmjs.com/package/ng-file-upload

【讨论】:

  • 你能帮帮我吗
  • 我从来没有使用过 lib multer,所以我需要更多的描述来帮助你。因为我的链接解释了如何做你想做的事,如果你说它不起作用,我需要更多关于错误的信息。
  • 那么您是否尝试将姓名和电子邮件放入您将发送到服务器的数据中?
  • 服务器端我得到未定义的值
【解决方案3】:

您可以添加一个保存file 的文件属性,并在Upload.upload 对象内更新data property to contain email and name。这样您就可以在服务器端轻松获取它们。

注意:我已经更新了我的答案,我将 Angular viewis 发出的所有值包装在 params 对象中。我还更改了 angular-ng-upload CDN 没有在 codepen 上工作。您还应该先加载Angular.js

查看

<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<script src="https://angular-file-upload.appspot.com/js/ng-file-upload-shim.js"></script>
<script src="https://angular-file-upload.appspot.com/js/ng-file-upload.js"></script>
<html>
    <head>
        <title>Home</title>
    </head>
    <body ng-app="fileUpload">
        <h1>Angular Node File Upload</h1>
        <form  ng-controller="MyCtrl as up" name="up.upload_form">

            name    
            <input type="text" ng-model="up.params.name"><br> <br>
            email   
            <input type="text" ng-model="up.params.email"><br> 
            Image 
            <input 
                type="file" 
                ngf-select 
                ng-model="up.params.file" 
                name="file" 
                ngf-max-size="20MB" 
                />
            Image thumbnail: <img style="width:100px;" ng-show="!!up.params.file" ngf-thumbnail="up.params.file || '/thumb.jpg'"/>
            <i ng-show="up.upload_form.params.file.$error.required">*required</i><br>
            <i ng-show="up.upload_form.params.file.$error.maxSize">File too large 
            {{up.params.file.size / 1000000|number:1}}MB: max 20M</i>
           <!--  Multiple files
            <div class="button" ngf-select ng-model="up.files" ngf-multiple="true">Select</div>
            Drop files: <div ngf-drop ng-model="up.files" class="drop-box">Drop</div> --><br> 
            <button type="submit" ng-click="up.submit()">submit</button>
            <p>{{up.progress}}</p>
            <p>{{up.params}}{{up.params.file.size}}</p>
        </form>
    </body>

</html>

角度

var vm = this;

vm.submit = function(){ 
   if (vm.upload_form.file.$valid && vm.params.file) {
       console.log(vm.params)
       vm.upload(vm.params); // Pass the `vm.params` object.
   }
 }

vm.upload = function (params) {

    console.log(params.name); // params.name should be available
    console.log(params.email); // params.email should be available
    console.log(params.file); // params.file should be available

    Upload.upload({
      url: 'http://localhost:3000/upload',
      file: params.file,   // Image to upload
      data: {
        name: params.name,
        email: params.email
      } 
    })
}

Node.js/express

app.post('/upload', function(req, res) {
    console.log(JSON.parse(req.body.data)); // email and name here
    console.log(req.files.file); // file object

    upload(req,res,function(err){
        if(err){
             res.json({error_code:1,err_desc:err});
             return;
        }
         res.json({error_code:0,err_desc:null});
    });
});

【讨论】:

  • req.body.data m 变得未定义
  • 我是这样的{}
  • Angular 部分可以记录你在调用 API 之前得到的表单对象
  • 角度我得到了价值,但在服务器端我变得不确定
  • 您在此处粘贴从角度视图获得的伪代码
猜你喜欢
  • 2015-07-12
  • 1970-01-01
  • 1970-01-01
  • 2021-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多