node.js - 检索存储在我的 Mlab 中的音频 - 二进制文件
问题描述
基本上,我已经使用 MediaDevices.getUserMedia WebRTC API 设置了一个应用程序。我已经录制了音频,理论上一切都很好。但是我现在必须检索音频来听他们。
我现在想知道如何在我的 MongoDB 数据库中下载音频 Post。我试图导出我的 MongoDB 数据库,但我只收到 JSON 或 CSV 文件,而不是我的音频文件。
我听说过 gridFS,但只是在图像处理上下文中。在深入研究 gridFS 之前,我会先了解您对使用 Mlab 检索音频的想法。和 MongoDB 更广泛。此外,gridFS 似乎是为大文件设计的,但就我而言,我只想存储数百字节的可笑小文件,所以 gridFS 似乎有点矫枉过正?也许有更有效的解决方案?
编辑:我努力翻译我的数据以便将其存储在我的数据库中。
到目前为止,我的控制台返回给我:
XML Parsing Error: syntax error
这是我的 App.js :
// post section
async handleSubmit(e){
e.preventDefault();
Axios.post("/api/words",{
"sound":this.state.blob
})
//.then((res) => res.json())
.then((data) => console.log(data))
//pass submitted value to true in order to declench allDelete function
}
(...)
// blob formatting section :
saveAudio() {
// convert saved chunks to blob
const blob = new Blob(this.chunks, {type: audioType});
this.setState({blob : blob})
谢谢。
解决方案
对于小于 16 MB 的文件,您不需要 GridFS。您可以使用BSON 的二进制类型将二进制数据直接存储在 MongoDB 中,也可以对二进制数据进行编码并将其存储为字符串。将二进制数据存储为字符串时,Base64 是一种常见的编码选择。
从数据库中检索数据后,您可以使用fs.writeFile
.
如果您将数据保存为二进制类型,则可以将缓冲区传递给fs.writeFile
. 如果您将数据保存为编码字符串,则可以传递字符串和encoding
选项。
(如果您想使用 Express 提供文件,您可以设置内容类型并使用 发送数据res.send
)
这是 NodeJS 中的一个小例子。这从磁盘读取音频文件,将其作为二进制类型保存到 MongoDB 数据库(使用 MongoDB 驱动程序的Binary类),从数据库中检索它,并将其写入磁盘上的新文件。
const mongodb = require('mongodb')
const util = require('util')
const fs = require('fs')
const readFile = util.promisify(fs.readFile)
const writeFile = util.promisify(fs.writeFile)
async function main() {
const client = await mongodb.MongoClient.connect(process.env.MONGO_URI)
console.log('connected')
let db = await client.db('dbname')
// Reading in binary data from a file. data is a buffer.
let data = await readFile(__dirname + '/sample.mp3')
// Insert binary data to the database
let res = await db.collection('coll').insert({data: new mongodb.Binary(data)})
console.log(res)
let objectId = res.ops[0]._id
// Retrieve binary data from the database
let obj = await db.collection('coll').findOne({_id: objectId})
console.log(obj)
// *** This is the key part ***
// use obj.data.read to get a buffer from the binary data and write that buffer to a file
await writeFile(__dirname + '/out.mp3', obj.data.read(0, obj.data.length()))
console.log('done')
}
main()
尽管人们确实将二进制数据存储在数据库中,但人们将文件存储在文件系统或对象存储(例如 Amazon S3)中可能是最常见的。然后他们只需将指向该文件的链接存储在数据库中并使用该链接检索该文件。你可以做任何你觉得更舒服的事情。
推荐阅读
- javascript - ComponentDidMount redux-saga 动作不起作用
- c++ - 即使直接构造函数有效,为什么 emplace_back 会失败?
- asp.net-mvc - Asp.net mvc5 hidden for 不会将数据传递给控制器
- .net - Vb .net Chart Spline 带有对数X轴的垂直方向得到异常
- python - 在Python中逐行修改字符串
- java - 我可以在 scriptlet 和 JSTL 之间传递以转义 XML 吗?
- gams-math - 如何访问 GAMS 子集中的成员?
- vagrant - 我可以在 Vagrant 中安装共享文件夹之前强制进行配置吗?
- reactjs - 将数据添加到 Firebase 中的现有节点
- ios - 自定义 AlertView 控制器未显示视图控制器的顶部?