【问题标题】:Upload images to Node.js using multer doesn't work使用 multer 将图像上传到 Node.js 不起作用
【发布时间】:2016-06-08 16:35:49
【问题描述】:

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

  1. bodyParser 需要一个中间件来处理图片文件,否则会回复

令牌未定义

  1. 我使用 Multer 作为中间件,正如this 所说,req.file 应该是一个数组信息,我可以使用 req.file.image.path 来获取文件路径和其他信息,而不是我可以将其保存为文件。

问题来了,我从 Postman 上传了一张图片,我只写了console.log(req.file) 它显示了undefined

如果我尝试写req.file.image.path来获取文件路径,错误是image undefined,好像我没有很好地使用multer,所以req.file没有保存数据信息,我应该创建一些临时文件夹以进行 multer 或...?

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

【问题讨论】:

  • 您能与我们分享您的 html 表单吗?
  • 我使用邮递员上传二进制图片文件,内容类型设置为image/jpeg
  • 尝试将req.file.image.path 更改为req.file.path(在exports.upload 块内)并创建/Node/file-upload/uploads/ 文件夹?
  • @danilodeveloper 也是一样,如果我登录 req.file ,它是未定义的,所以我不知道,我检查了 multer github,很少有人有同样的问题,有和中间件上传推荐?
  • 来自 github repo 注意:在将目标提供为函数时,您负责创建目录。传递字符串时,multer 将确保为您创建目录。您是否创建了 dest 文件夹?

标签: javascript node.js express multer


【解决方案1】:

在邮递员中发送图片前需要设置文件名,如图here

干杯。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2018-11-07
      • 2017-05-22
      • 2021-06-10
      • 2015-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-04
      • 2021-10-17
      相关资源
      最近更新 更多