使用multer将图像上传到Node.js并不起作用

时间:2016-02-25 18:19:17

标签: javascript node.js express multer

我正在尝试将图片上传到node.js express

  1. bodyParser需要一个中间件来处理图像文件,否则它将回复
  2.   

    令牌取消定义

    1. 我使用Multer作为中间件,正如this所说,req.file应该挖出一个信息数组,而不是使用req.file.image.path来获取文件路径和其他信息,我可以将其保存为文件。
    2. 问题是,我从Postman上传了一张图片,我只写console.log(req.file)它显示undefined

      如果我尝试编写req.file.image.path来获取文件路径,则错误为image undefined,好像我没有使用multer,所以req.file没有&# 39; t保存数据信息,我应该创建一些临时文件夹来进行修改或......?

      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',songs.upload);
      

      route.js

      var mongoose = require('mongoose');
      var uri = "mongodb://1111:1111@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');
      var multer = require('multer');
      
      var storage =   multer.diskStorage({
            destination: function (req, file, callback) {
                         callback(null, '/Node/file-upload/uploads/');
                          },
            filename: function (req, file, callback) {
                         callback(null, file.fieldname + '-' + Date.now());
                         }
                   });
      
       var upload = multer({ storage : storage}).single('image');
      
      
      db.on('error', console.error.bind(console, 'connection errrrrrrrror:'));
      db.once('open', function() {
            console.log("mongodb is connected!!");
            });
      
      exports.upload = function(req, res) {
              upload(req,res,function(err) {
                     console.log(req.file);
                       fs.readFile(req.file.image.path, function (err, data){
                            var dirname = "/Node/file-upload/uploads/";
                            var newPath = dirname + req.body.filename;
                       fs.writeFile(newPath, data, function (err) {
                           if(err) {
                               return res.end("Error uploading file.");
                                  }
                                       res.end("File is uploaded");
                         });
                   });
             });
        };
      

      错误

       TypeError: Cannot read property 'image' of undefined
      at c:\Users\awei\WebstormProjects\untitled\routes\girlshanlder.js:107:28
      

2 个答案:

答案 0 :(得分:2)

您需要在Postman中发送图像之前设置文件名,如图here

所示

干杯。

答案 1 :(得分:0)

在MySQL数据库和文件夹中上传图像的完整代码。

只需定义模块并安装multer和路径并保存即可。

var multer = require('multer'); 
var path   = require('path');

var storage = multer.diskStorage({
    destination: function(req, file, callback) {
        callback(null, './uploadimages')
    },
    filename: function(req, file, callback) {
        callback(null, file.fieldname + '-' + Date.now() + path.extname(file.originalname))
    }
})

app.post('/imginsert',multer({
    storage: storage,
    fileFilter: function(req, file, callback) {
        var ext = path.extname(file.originalname)
        if (ext !== '.png' && ext !== '.jpg' && ext !== '.gif' && ext !== '.jpeg') 
                    {
            return callback(res.end('Only images are allowed'), null)
        }
        callback(null, true)
    }
}).single('img'), function(req, res) {
 /*img is the name that you define in the html input type="file" name="img" */       

        var data = {
            table_column_name(your database table column field name) :req.file
        };
        var query = connection.query("Insert into tablename set ?" ,data,function(err, rows)      
        {                                                      
          if (err)
             throw err;
         res.redirect('/blog');
        });
        console.log(query.sql);
        console.log(req.file);
    });