我要实现一个这样的系统:用户上传音频文件,在服务端调用一个命令行程序对该音频文件进行处理,生成一个新的文件,生成完毕后,通知用户文件准备完毕。
实现思路是什么样的?可以脱离具体实现讲讲思路,也可以结合必要的代码。如果要结合代码讲解,请使用 nodejs 技术栈
实现思路:
const { spawn } = require('child_process');
const express = require('express');
const multer = require('multer');
const app = express();
const upload = multer({ dest: 'uploads/' });
app.post('/upload', upload.single('audio'), (req, res) => {
const { path: filePath, originalname } = req.file;
const outputFileName = `${originalname}-processed.mp3`;
const ls = spawn('command', ['-i', filePath, '-o', outputFileName]);
ls.on('close', (code) => {
console.log(`child process exited with code ${code}`);
// 处理结束后,通知用户文件准备完毕
res.send('File processed successfully');
});
});
以上是一个简单的实现思路,具体实现还需要根据具体需求进行适当的修改和优化。
通知用户的措施需要优化下,用户此时在我的 app
如果用户在你的 app 中,可以考虑使用 WebSocket 技术来实现实时通知功能。
实现思路:
后端代码可以如下所示:
const { spawn } = require('child_process');
const express = require('express');
const multer = require('multer');
const WebSocket = require('ws');
const app = express();
const upload = multer({ dest: 'uploads/' });
const wss = new WebSocket.Server({ port: 8080 });
wss.on('connection', (ws) => {
console.log('WebSocket connected');
ws.on('message', (data) => {
console.log(`Received message: ${data}`);
});
});
app.post('/upload', upload.single('audio'), (req, res) => {
const { path: filePath, originalname } = req.file;
const outputFileName = `${originalname}-processed.mp3`;
const ls = spawn('command', ['-i', filePath, '-o', outputFileName]);
ls.on('close', (code) => {
console.log(`child process exited with code ${code}`);
// 处理结束后,通过 WebSocket 向前端发送通知
wss.clients.forEach((client) => {
if (client.readyState === WebSocket.OPEN) {
client.send('File processed successfully');
}
});
});
});
前端代码可以如下所示:
const socket = new WebSocket('ws://localhost:8080');
socket.addEventListener('open', () => {
console.log('WebSocket connected');
socket.send('Hello Server!');
});
socket.addEventListener('message', (event) => {
console.log(`Received message: ${event.data}`);
// 处理完毕后,弹出通知框
alert('File processed successfully');
});
以上是一个简单的实现思路,具体实现还需要根据具体需求进行适当的修改和优化。
upload.single('audio') 这句代码是做什么的
upload.single('audio') 是一个 multer 中间件,用于处理文件上传。它的作用是将上传的文件保存到指定的目录中,并将文件信息添加到 req.file 对象中。
在该代码中,upload.single('audio') 表示上传的文件类型为 audio。这里的 audio 是一个表单字段,用于上传音频文件。如果上传的是图片,则可以使用 upload.single('image'),其中 image 表示上传的是图片文件。
使用 upload.single 中间件后,请求对象 req 中会新增一个 file 属性,其中包含了上传的文件的基本信息,如文件名、文件类型、文件大小、文件路径等。在上面的代码中,我们通过解构赋值的方式获取了文件的路径和原始文件名,用于后续的处理。