繁体   English   中英

如何通过 post 方法和 nodejs 发送多种编码类型?

[英]How do I send multiple encoding types via a post method and nodejs?

我正在尝试将名称和描述文本数据与视频一起发送,但我只能发送视频或文本,不能同时发送。

这是帖子文件的 .ejs 代码:

<!DOCTYPE html>
<html>
<body>
    <form action="/uploadvideo" enctype="multipart/form-data" method="POST">
        <input type="text" name="name" placeholder="Name" required/>
        <input type="text" name="description" placeholder="Description" required/>
        <input type="file" name="video" accept=".mp4" required/>
        <input type="submit" value="Upload"/>
    </form>
</body>
</html>

这是 post 方法的 nodejs 代码:

var storage = multer.diskStorage({
    destination: function (req, file, cb) {
        const directories = getDirectories('views/videos/')
        const nextNumber = parseInt(directories[directories.length - 1])
        if (nextNumber === NaN)
        {
            cb(new Error('Cannot save file, NaN'), null)
        }
        else
        {
            cb(null, 'views/videos/' + nextNumber)
        }
    },
    filename: function (req, file, cb) {
        cb(null, 'video.mp4')
    }
})

var upload = multer({storage: storage})

app.post('/uploadvideo', (req, res, next) => {
    const directories = getDirectories('views/videos/')
    const nextNumber = parseInt(directories[directories.length - 1]) + 1
    if (!fs.existsSync('views/videos/' + nextNumber))
    {
        fs.mkdirSync('views/videos/' + nextNumber)
    }
    fs.writeFileSync('views/videos/' + nextNumber + '/data.txt', req.body.name + '\n' + req.body.description + '\n')
    fs.writeFileSync('views/videos/' + nextNumber + '/video.mp4', 'error')
    return next()
}, upload.any('video'), (req, res, next) => {
    const directories = getDirectories('views/videos/')
    const nextNumber = parseInt(directories[directories.length - 1])
    if (fs.readFileSync('views/videos/' + nextNumber + '/video.mp4').toString() === 'error')
    {
        rimraf.sync('views/videos/' + nextNumber)
        res.render('error.ejs', {message: "Error uploading video"})
    }
    else
    {
        loadVideo(nextNumber)
        res.redirect('/video?video=' + nextNumber)
    }
})

如果我将 enctype 设置为“multipart/form-data”,则仅发送视频且文本未定义,但如果我使用“application/x-www-form-urlencoded”,则仅发送文本,但视频不发送吨。

有什么办法可以同时发送吗? 提前致谢。

首先附加 multer,它将req.filereq.body分开:

const fsPromises = require('fs').promises;
const path = require('path');
const pathToVideos = path.join(__dirname, 'views/videos/');

app.post(
  '/uploadvideo',
  upload.any('video'),
  async (req, res, next) => {
    const directories = getDirectories(pathToVideos);
    const nextNumber = parseInt(directories[directories.length - 1]) + 1;
    const newVideoFolder = pathToVideos + '/' + nextNumber;

    try {
      // checking if folder exists
      const exists = await fsPromises.access(newVideoFolder).then(() => true).catch(() => false);
      if (!exists) await fsPromises.mkdir(newVideoFolder); // need to create

      // writing to file info to data.txt
      await fsPromises.writeFile(
        path.join(newVideoFolder, 'data.txt'),
        req.body.name + '\n' + req.body.description + '\n'
      );

      // if file not exists throw error
      await fsPromises.access(
        path.join(newVideoFolder, 'video.mp4')
      );

      loadVideo(nextNumber);
      res.redirect('/video?video=' + nextNumber);
    } catch (error) {
      rimraf(newVideoFolder, () => {});
      console.error(error);
      res.render('error.ejs', {message: "Error uploading video"});
    }
  });

PS 使用异步/等待承诺(手册: https : //nodejs.org/dist/latest-v10.x/docs/api/fs.html#fs_fs_promises_api

示例: https : //www.codota.com/code/javascript/functions/fs/promises

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM