【问题标题】:Node.js - expressjs - multer req.files outputs emptyNode.js - expressjs - multer req.files 输出为空
【发布时间】:2017-07-27 15:33:51
【问题描述】:

我正在使用 multer 从这个表单中获取文件

<form action="/api/pimage" method="POST" enctype="multipart/form-data">
    <fieldset>
        <input type="file" name="profileimage">
        <input type="submit">
    </fieldset>
</form>

使用这个服务器端脚本

app.post('/api/pimage', function(req, res, next) {
    console.log(req.body, req.files);
});

问题是 req.body 正在打印出 { profileimage: 'image.png' } 并且 req.files 正在打印出 {} 你在哪里看到问题? 谢谢

附:我使用app.use(bodyParser.urlencoded({ extended: false })); 获取req.body 和app.use(multer({ dest: './uploads/'})); 获取req.files

【问题讨论】:

  • 目录uploads是否存在且可写?
  • 目录是 multer 在启动时自动创建的
  • 如果您看到req.body.profileimage,那么您的请求不会以某种方式以multipart/form-data 发送。这就是当Content-Typeapplication/x-www-form-urlencoded 时您会看到的内容。你能把console.dir(req.headers['content-type']) 放在你的app.post() 处理程序中吗?
  • 是的,你是对的,是打印出 'application/x-www-form-urlencoded' 而不是 multipart/form-data

标签: node.js express multer


【解决方案1】:

我发现将multerbodyParser 一起使用会导致req.file 未定义。如果您遇到问题,请务必检查一下。

【讨论】:

    【解决方案2】:

    我把我的(有很多我想象的,当然更好的)解决方案来帮助像我这样的很多人,因为我已经搜索了 1 天 ;-(


    var express = require('express');
    var fileUpload = require('express-fileupload');
    var fs = require("fs");
    var app = express();
    
    console.log('étape 0');
    
    app.use(express.static('mesStatic'));
    app.use(fileUpload());
    
    console.log('étape 1');
    
    app.get('/indexFileUpload.htm', function (req, res) {
       res.sendFile( __dirname + "/" + "indexFileUpload.htm" );
    })
    
    console.log('étape 2');
    
    app.post('/file_upload', function (req, res) {
    
       console.log('étape 3');
       console.log('req.files:' , req.files);
    
       if (!req.files) {
           res.send('No files to upload.');
           return;
       }
    
       console.log('req.files.file.data:' , req.files.file.data);
       var bufDataFile = new Buffer(req.files.file.data, "utf-8");
       console.log('étape 3.1');
       console.log('__dirname : ' + __dirname);
    
       fs.writeFile(__dirname + '/file_upload/output.txt', bufDataFile,  function(err) {
          if (err) {
             return console.error(err);
          }
          else {
             console.log("Data written successfully !");
          }      
          console.log('étape 4');
          res.end('Fin OK !!!');  
       })
    })
    var server = app.listen(8081, function () {
       var host = server.address().address
       var port = server.address().port
    
       console.log("Example app listening at http://%s:%s", host, port);
    })
    

    【讨论】:

      【解决方案3】:

      function(req, res)中请求req.file之前,您必须提供为multer定义的上传功能,您可以按照下面给出的代码进行操作

          var Storage = multer.diskStorage({
              destination: function (req, file, callback) {
                  callback(null, "./images/");
              },
              filename: function (req, file, callback) {
                  callback(null, file.fieldname + '_' + Date.now() + '.jpg');
              }
          });
          var upload = multer({ storage: Storage }).single('imagePath');
      
          router.post('/file_upload', upload, function(req, res, next){
              console.log(req.file);
      var Storage = multer.diskStorage({
          destination: function (req, file, callback) {
              callback(null, "./public/images/");
          },
          filename: function (req, file, callback) {
              callback(null, file.fieldname + '_' + Date.now() + '.jpg');
          }
      });
      var upload = multer({ storage: Storage }).single('imagePath');
      
      router.post('/add-product', upload, function(req, res, next){
          var newProduct = new Product();
      }
      

      【讨论】:

      • 这太棒了! TL;DR 添加存储
      猜你喜欢
      • 2018-12-21
      • 2018-12-04
      • 2016-10-30
      • 2017-01-28
      • 1970-01-01
      • 2021-08-29
      • 1970-01-01
      • 2022-07-23
      • 2018-08-19
      相关资源
      最近更新 更多