[英]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.file
与req.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.