如何正确地将 blob 从前端传递到后端?

How to properly pass a blob from the frontend to the backend?

我正在尝试使用 formData 将音频文件从我的 react 应用程序传递到 Express 后端,但是当我尝试在后端检索数据时,我一直未定义.

前端代码:

var fd = new FormData();
fd.append('fname', 'test.webm');
fd.append('data', blob);

payload = {audioFile: fd};

axios.post('/translate-audio', payload, {headers: {'content-type': 'multipart/form-data'}})

后端代码:

app.use(cors());
app.use(express.json());

app.post('/translate-audio', async (req, res) => {
    console.log(req.body.audioFile);
});

旁注:

我在前端 运行 console.log(payload.audioFile.get('data')); 时能够看到该文件:

File {name: 'blob', lastModified: 1636600689885, lastModifiedDate: Wed Nov 10 2021 19:18:09 GMT-0800 (Pacific Standard Time), webkitRelativePath: '', size: 10828, …}
    lastModified: 1636600689885
    lastModifiedDate: Wed Nov 10 2021 19:18:09 GMT-0800 (Pacific Standard Time) {}
    name: "blob"
    size: 10828
    type: "audio/webm;codecs=opus"
    webkitRelativePath: ""

非常感谢任何帮助。我只需要将 blob 正确传递到后端,因此不使用 formData 的其他替代方法也会有所帮助。另外,有什么好的方法可以反过来(将音频 blob 从服务器发送到前端)?

您无法将 FormData 序列化为 JSON。直接发送 FormData 作为您的请求数据,并使用像 Multer 这样的中间件在服务器端处理它

前端

const fd = new FormData()
fd.append("audioFile", blob, "test.webm")

// Do not customise the content-type header.
// See 
axios.post("/translate-audio", fd)

快递

const multer  = require("multer")
const storage = multer.memoryStorage() // or use disk storage
const upload = multer({ storage })

app.post('/translate-audio', upload.single("audioFile"), async (req, res) => {
  console.log(req.file);
  // see https://github.com/expressjs/multer#file-information
});

Also, what is a good way to do this the other way around (sending audio blob from server to frontend)?

如果您正在处理磁盘上的文件,使用 res.sendFile(), otherwise res.send() 能够处理缓冲区。