【问题标题】:How to use multer to upload file/to do Post in form-data?如何使用 multer 上传文件/在表单数据中发布?
【发布时间】:2017-12-25 17:26:10
【问题描述】:

这是 productsModel.js 文件

'use strict';
var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var productsSchema = new Schema({
      name: {
        type: String,
        required: true
      },
      cost: {
          type: Number
      },
      product_imagePaths: [{
          type: String
      }]
    });

module.exports = mongoose.model('Products', productsSchema);

这是我的 productsController.js 的代码

var mongoose = require('mongoose'),
Products = mongoose.model('Products');


exports.uploadProducts = function(req,res) {
    var new_product = new Products(req.body)
    new_product.save(function(err,product){
        if(err) {
            res.send(err);
         }
         res.status = 200;
         res.json({
            "status":"success"
         });
     }); 
};

productsRou​​tes.js

'use strict';
module.exports = function (app) {
  var productsController = require('../controllers/productsController');

  app.route('/products')
    .get(productsController.fetchAllProducts)
    .post(productsController.uploadProducts);
};

在我的 server.js 中

// mongoose instance connection url connection
mongoose.Promise = global.Promise;
var db = mongoose.connect('mongodb://localhost/abcd', {
    useMongoClient: true
}); 


 // body parser middleware
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: true }));

// route
var userRoutes = require('./api/routes/userRoutes');
var aboutUsRoutes = require('./api/routes/aboutusRoutes');
var productsRoutes = require('./api/routes/productsRoutes');
userRoutes(app);
aboutUsRoutes(app);
productsRoutes(app);

现在,当我使用 x-www-form-urlencoded 时,这可以正常工作。但由于我想通过Post 方法(productsController.js 中的uploadProducts)上传文件,所以只能通过form-data 完成。但是,它不适用于form-data。我读到multer 可用于form-data 上传,但我不知道如何在以下方法中使用它。

【问题讨论】:

  • 你有没有使用任何框架来编写客户端部分?
  • 我正在使用 Angular 4。

标签: node.js mongoose routes multer form-data


【解决方案1】:

您想在调用 uploadProducts 函数之前使用 multer 作为中间件。

这是productRoutes.js 的示例设置

'use strict';
 const multer = require('multer')
 const storage = multer.memoryStorage()
 const upload = multer({
      storage: storage,
      limits: {
        fileSize: 5000000,
        files: 1
      }
    })
module.exports = function (app) {
  var productsController = require('../controllers/productsController');

  app.route('/products')
    .get(productsController.fetchAllProducts)
    .post(upload.single('img'), productsController.uploadProducts);
};

这将为您的图像创建一个Buffer,您可以在productsController.jsreq.file.buffer 中访问它。

请注意,upload.singlemulter 的内置函数。阅读更多关于其他功能的信息hereimg 也需要匹配你输入字段的名称,即<input type="file" name="img">

这只是众多方法之一。希望对您有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-11
    • 2020-09-21
    • 2019-07-31
    • 2017-03-29
    • 2018-10-26
    • 1970-01-01
    相关资源
    最近更新 更多