【问题标题】:How upload a file with express/multer without redirecting如何在不重定向的情况下使用 express/multer 上传文件
【发布时间】:2018-05-17 07:13:18
【问题描述】:

注意:我找到了this 的帖子,但我没有发现有帮助,其他帖子与 angular/react 相关,我没有使用。

我有一个文件上传,它应该发送一个文件类型正确的响应。文件上传正常,但我的页面重定向到文件所在的位置。我希望该页面在它所在的同一页面上相同。

home.ejs:

<!-- upload video -->
<form method="post" action="/upload" class="custom-file" enctype="multipart/form-data">
  <input type="file" name="video-file" class="custom-file-input" />
  <span class="custom-file-control"></span>

  <!-- optional dropdown to specify number of cores -->
  <div class="dropdown">
    <button class="btn btn-secondary dropdown-toggle" 
            type="button" 
            id="dropdownMenuButton" 
            data-toggle="dropdown" 
            aria-haspopup="true" 
            aria-expanded="false"
            name="number-of-cores">
      Use all Cores
    </button>
    <div class="dropdown-menu" aria-labelledby="dropdownMenuButton">
      <a class="dropdown-item">Use all Cores</a>
      <a class="dropdown-item">Use one Core</a>
    </div>
  </div>

  <!-- upload button -->
  <input class="btn btn-primary upload-btn" type="submit" id="upload-btn" value="Upload">

这就是我希望页面不重定向的原因;这样页面就可以显示文件的格式是否正确。

$('body').on('click', '#upload-btn', function (event) {
      $.ajax({
          type: 'POST',
          url: '/',
          dataType : "application/json; charset=utf-8",
          contentType: JSON.stringify(false),
          success: function (response) { 
              $("#errorMessage").html("* file successfully opened");
              console.log('successfully uploaded', response);
          },
          error: function (result) {
              $("#errorMessage").html("* Incorrect file/no file given");
              console.log('coudn\'t upload');
          }
      });
      //return false;
  })

server.js

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

const app = express();

app.set('view engine', 'ejs');
app.set('views', './views');
app.use(express.static('public'));

function fileFilter (req, file, cb) {
    if (path.extname(file.originalname) !== '.mp4') {
        return cb(null, false);
    }

    cb(null, true);
}

const upload = multer({ dest: 'uploads/', fileFilter:fileFilter});

app.get('/', (req, res) => {
    res.render('home', { testGreeting: 'Hello world' });
});

app.post('/upload', upload.single('video-file'), function(req, res) {
    console.log(req.file);
    console.log(req.params);
    if (req.file) {
        console.log("successfully received");
        res.send({success: "success"});
    }
    return res.end();
});

app.listen(3000, () => console.log('Listening on Port 3000.'));

这可能是题外话,但我的 ajax 代码总是运行错误,从来没有成功。如果我也能得到帮助,将不胜感激。 谢谢!

更新:event.preventDefault() 是解决方案:

$('body').on('click', '#upload-btn', function (event) {
      event.preventDefault();
      $.ajax({
              ... //same as before
      });
      return false;
})

【问题讨论】:

  • 在 app.post/upload 中尝试 res.redirect('/') 而不是 res.end()
  • 你为什么把return false;注释掉了?取消注释时会发生什么?
  • @YasserHussain 我试过了,据我所知没有发生任何事情。至少,它并没有解决我的问题
  • 你试过event.preventDefault吗?

标签: javascript ajax express multer


【解决方案1】:

您需要在客户端使用event.preventDefault() 阻止默认浏览器操作。您可以了解更多关于 preventDefault here

【讨论】:

    猜你喜欢
    • 2019-10-03
    • 2018-12-27
    • 2021-08-11
    • 2018-07-21
    • 2016-10-22
    • 2017-07-06
    • 1970-01-01
    • 2010-09-16
    • 2011-04-09
    相关资源
    最近更新 更多