【问题标题】:how to upload image file and display using express nodejs如何使用express nodejs上传图像文件并显示
【发布时间】:2023-03-03 01:29:01
【问题描述】:

我使用了以下代码:

文件上传.html

<html>
<head>
<title>File Uploading Form</title>
</head>
<body>
<h3>File Upload:</h3>
Select a file to upload: <br />
<form action="http://127.0.0.1:8081/file_upload" method="POST" enctype="multipart/form-data">
<input type="file" name="file" size="50" />
<br />
<input type="submit" value="Upload File" />
</form>
</body>
</html>

文件上传.js:

var express = require('express');
var app = express();
var fs = require("fs");

var bodyParser = require('body-parser');
var multer  = require('multer');

//console.log(multer);

app.use(express.static('public'));
app.use(bodyParser.urlencoded({ extended: false }));
app.use(multer({ dest: '/tmp/'}));

app.get('/fileupload.html', function (req, res) {
   res.sendFile( __dirname + "/" + "fileupload.html" );
})

app.post('/file_upload', function (req, res) {

   console.log(req.files.file.name);
   console.log(req.files.file.path);
   console.log(req.files.file.type);

   var file = __dirname + "/" + req.files.file.name;
   fs.readFile( req.files.file.path, function (err, data) {
        fs.writeFile(file, data, function (err) {
         if( err ){
              console.log( err );
         }else{
               response = {
                   message:'File uploaded successfully',
                   filename:req.files.file.name
              };
          }
          console.log( response );
          res.end( JSON.stringify( response ) );
       });
   });
})

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

我已经使用上面的这些代码进行文件上传但是当在终端中使用 node fileupload.js 执行时,我收到类型错误TypeError('app.use() requires middleware functions');

谁能帮忙解决这个问题。

【问题讨论】:

    标签: javascript node.js file-upload


    【解决方案1】:

    您正在尝试使用 multer 的旧 API。它不久前发生了变化,请参阅documentation 了解更多信息。

    在您上传单个文件的特定情况下,您将删除 app.use(multer({ ... })) 行,而使用 .single()req.file 之类的:

    var upload = multer({ dest: '/tmp/'});
    
    // File input field name is simply 'file'
    app.post('/file_upload', upload.single('file'), function(req, res) {
      var file = __dirname + '/' + req.file.filename;
      fs.rename(req.file.path, file, function(err) {
        if (err) {
          console.log(err);
          res.send(500);
        } else {
          res.json({
            message: 'File uploaded successfully',
            filename: req.file.filename
          });
        }
      });
    });
    

    【讨论】:

    • 非常感谢 mscdex .File 上传成功
    • @SunilGarg 当您发布到您的服务器时,请确保您在一个名为“文件”的字段中发送您的图像...
    • 我如何将图像路径存储在数据库表(MySQL)中
    【解决方案2】:

    Multer 向请求对象添加一个主体对象和一个或多个文件对象。 body 对象包含表单文本字段的值,文件或文件对象包含通过表单上传的文件。

    使用此代码,希望对您有所帮助。

    var express = require('express');
    var app = express();
    var fs = require("fs");
    
    var bodyParser = require('body-parser');
    var multer = require('multer');
    
    app.use(express.static('public'));
    app.use(bodyParser.urlencoded({ extended: false }));
    var upload = multer({ dest: '/tmp' })
    
    app.get('/fileupload.html', function (req, res) {
       res.sendFile( __dirname + "/" + "fileupload.html" );
    })
    
    app.post('/file_upload', upload.single("file"), function (req, res) {
       var file = __dirname + "/" + req.file.originalname;
       fs.readFile( req.file.path, function (err, data) {
            fs.writeFile(file, data, function (err) {
             if( err ){
                  console.error( err );
                  response = {
                       message: 'Sorry, file couldn\'t be uploaded.',
                       filename: req.file.originalname
                  };
             }else{
                   response = {
                       message: 'File uploaded successfully',
                       filename: req.file.originalname
                  };
              }
              res.end( JSON.stringify( response ) );
           });
       });
    })
    
    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】:

    上面的解决方案对我不起作用,所以我使用了存储方法:

    var express = require('express');
    var app = express();
    var fs = require("fs");
    
    var bodyParser = require('body-parser');
    var multer  = require('multer');
    
    app.use(express.static('public'));
    app.use(bodyParser.urlencoded({ extended: false }));
    
    app.get('/index.htm', function (req, res) {
        res.sendFile( __dirname + "/" + "index.htm" );
    })
    
    
    var storage = multer.diskStorage({
        destination: function (req, file, cb) {
            cb(null, './uploads/')
        },
        filename: function (req, file, cb) {
            var ext = require('path').extname(file.originalname);
            ext = ext.length>1 ? ext : "." + require('mime').extension(file.mimetype);
            require('crypto').pseudoRandomBytes(16, function (err, raw) {
                cb(null, (err ? undefined : raw.toString('hex') ) + ext);
            });
        }
    });
    
    var upload = multer({ storage: storage });
    
    app.post('/file_upload', upload.any(), function (req, res, next) {
        res.send(req.files);
    })
    

    【讨论】:

      【解决方案4】:

      它对我有效

      var express = require('express'),
          http = require('http'),
          formidable = require('formidable'),
          fs = require('fs'),
          path = require('path');
      var bodyParser = require('body-parser');
      var multer  = require('multer');
      var upload = multer({ dest: '/tmp/'});
      var app = express();
      
      
      app.get('/', function(req, res) {
        res.sendFile(path.join(__dirname + '/index.html'));
      });
      
      var server = app.listen(3000, function() {
        console.log('leistening on port', server.address().port);
      })
      
      app.post('/upload', upload.single('file'), function(req, res) {
        var file = 'uploads' + '/' + req.file.originalname;
        fs.rename(req.file.path, file, function(err) {
          if (err) {
            res.send(500);
          } else {
            res.json({
              message: 'File uploaded successfully',
              filename: req.originalname
            });
          }
        });
      });
      <!DOCTYPE html>
      <!--[if lt IE 7]>      <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
      <!--[if IE 7]>         <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
      <!--[if IE 8]>         <html class="no-js lt-ie9"> <![endif]-->
      <!--[if gt IE 8]><!--> <html class="no-js"> <!--<![endif]-->
          <head>
              <meta charset="utf-8">
              <meta http-equiv="X-UA-Compatible" content="IE=edge">
              <title></title>
              <meta name="description" content="">
              <meta name="viewport" content="width=device-width, initial-scale=1">
              <link rel="stylesheet" href="">
          </head>
          <body>
                  <form action="http://127.0.0.1:3000/upload" enctype="multipart/form-data" method="post">
                      <input type="text" name="title">
                      <input type="file" name="file">
                      <input type="submit" value="Upload">
                      
                  </form>
          </body>
      </html>

      【讨论】:

        【解决方案5】:

        似乎保留原始文件名或扩展名并不安全,我发现/制作了这段代码,通过将 .jpg 添加到您的文件 url 来直接在任何地方显示图像:

        restapi.get('/uploads/:id', function (req, res) {
          var storedMimeType = 'image/jpeg';
          res.setHeader('Content-Type', storedMimeType)
         fs.createReadStream(path.join('./uploads/', req.params.id).replace(/\.[^/.]+$/, "")).pipe(res)
        })
        

        【讨论】:

          猜你喜欢
          • 2021-03-31
          • 1970-01-01
          • 2018-07-21
          • 2017-09-07
          • 1970-01-01
          • 2014-10-10
          • 2018-01-02
          • 2018-03-19
          • 1970-01-01
          相关资源
          最近更新 更多