简体   繁体   中英

Upload image to Node.js image' of undefined

Sorry for poor Indent I'm new to node.js ,trying to upload image to node.js check lot's of answer , please coorect me if I'm wrong

1.bodyParser need a middleware to handle binary file, such as IMAGE if I don't use it, it will show

undefine token

2.use Multer as a middleware , like this

 var multer = require('multer') var upload = multer({ dest:'/Node/file-upload/uploads/' }); app.post('/upload',upload.array(),songs.upload); 
  1. follow this , req.files is the image file , req.body is the file name so I use fs.readFile to read the file
 fs.readFile(req.files.image.path, function (err, data) 

4.than I need a file path and file name , I use req.body

 var dirname = "/Node/file-upload/uploads/"; var newPath = dirname + req.body.image.filename; 

5.than writ the data into the destination by this

 fs.writeFile(newPath, data, function (err) 

I'm not sure what part I missed , it took me 10 hours to do this please help

it always tell me TypeError: Cannot read property 'image' of undefined

app.js

var    express = require('express')
      ,bodyParser = require('body-parser')
      ,app = express()
      ,multer  =  require('multer')
      ,binary = require('binary')
      ,fs = require('fs')
      ,util= require('util')
      ,http = require('http')
      ,multer = require('multer')
      ,upload = multer({ dest: '/Node/file-upload/uploads/' });

 app.use(bodyParser.urlencoded({ extended: true })); // support encoded bodies.
 app.use(bodyParser.json({limit: '5mb'}));


songs = require('./routes/route');

app.listen(3000, function () {
      console.log('Example app listening on port 3000!');
                          });
app.post('/upload',upload.array(),songs.upload);

route.js

var mongoose = require('mongoose');
var uri = "mongodb://xxxxxx:xxxxxxx@ds061365.mongolab.com:61365/aweitest";
mongoose.connect(uri);
// we're connected!
var db = mongoose.connection.db;
var BSON = require('bson').BSONPure;
var binary = require('binary');
var body = require('body-parser');
var fs = require('fs');

db.on('error', console.error.bind(console, 'connection errrrrrrrror:'));

db.once('open', function() {
     console.log("mongodb is connected!!");
 });

exports.upload = function(req, res) {
    console.log(req.body);
       fs.readFile(req.files.image.path, function (err, data){
            var dirname = "/Node/file-upload/uploads/";
            var newPath = dirname + req.body.image.filename;
       fs.writeFile(newPath, data, function (err) {
            if(err){
                res.json({'response':"Error"});
            }else {
                res.json({'response':"Saved"});
          }
       });
    });
  };

error

TypeError: Cannot read property 'image' of undefined
at exports.upload (c:\Users\awei\WebstormProjects\untitled\routes\girlshanlder.js:92:26)
at Layer.handle [as handle_request] (c:\Users\awei\node_modules\express\lib\router\layer.js:95:5)
at next (c:\Users\awei\node_modules\express\lib\router\route.js:131:13)
at multerMiddleware (c:\node_modules\multer\lib\make-middleware.js:18:41)
at Layer.handle [as handle_request] (c:\Users\awei\node_modules\express\lib\router\layer.js:95:5)
at next (c:\Users\awei\node_modules\express\lib\router\route.js:131:13)
at Route.dispatch (c:\Users\awei\node_modules\express\lib\router\route.js:112:3)
at Layer.handle [as handle_request] (c:\Users\awei\node_modules\express\lib\router\layer.js:95:5)
at c:\Users\awei\node_modules\express\lib\router\index.js:277:22
at Function.process_params (c:\Users\awei\node_modules\express\lib\router\index.js:330:12)
at next (c:\Users\awei\node_modules\express\lib\router\index.js:271:10)
at jsonParser (c:\Users\awei\node_modules\body-parser\lib\types\json.js:107:37)
at Layer.handle [as handle_request] (c:\Users\awei\node_modules\express\lib\router\layer.js:95:5)
at trim_prefix (c:\Users\awei\node_modules\express\lib\router\index.js:312:13)
at c:\Users\awei\node_modules\express\lib\router\index.js:280:7
at Function.process_params (c:\Users\awei\node_modules\express\lib\router\index.js:330:12)

upload.array() in your app.js should be

upload.array('image',1) // 1 here is number of files you would upload

the in your songs.upload middleware you would get req.files.image as an array,

So you would better check for the length of the array and iterate over it to save each file, or if you just want to save 1 file you can do following.

Example:

app.js

app.post('/upload',upload.array('image',1),songs.upload);

route.js

var mongoose = require('mongoose');
var uri = "mongodb://xxxxxx:xxxxxxx@ds061365.mongolab.com:61365/aweitest";
mongoose.connect(uri);
// we're connected!
var db = mongoose.connection.db;
var BSON = require('bson').BSONPure;
var binary = require('binary');
var body = require('body-parser');
var fs = require('fs');

db.on('error', console.error.bind(console, 'connection errrrrrrrror:'));

db.once('open', function() {
     console.log("mongodb is connected!!");
 });

exports.upload = function(req, res) {
    console.log(req.body);
       fs.readFile(req.files.image[0].path, function (err, data){
            var dirname = "/Node/file-upload/uploads/";
            var newPath = dirname + req.body.image.filename;
       fs.writeFile(newPath, data, function (err) {
            if(err){
                res.json({'response':"Error"});
            }else {
                res.json({'response':"Saved"});
          }
       });
    });
  };

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM