检索存储在我的Mlab中的音频 - 二进制文件



基本上,我已经使用MediaDevices.getUserMedia WebRTC API设置了一个应用程序。我已经录制了音频和所有内容,理论上一切都很好。但是我现在必须检索音频来听它们。

我现在想知道如何在我的MongoDB数据库中下载音频帖子。我尝试导出我的MongoDB数据库,但我只收到JSON或CSV文件,而不是我的音频文件。

我听说过gridFS,但仅限于图像处理上下文。在深入研究 gridFS 之前,我会了解您对使用 Mlab 检索音频的想法。和MongoDB更广泛。 另外,gridFS 似乎是为大文件设计的,但就我而言,我只想存储几百字节的小文件,所以 gridFS 似乎有点过分了?也许有更有效的解决方案?

编辑:我努力翻译我的数据,以便将其存储在我的数据库中。

到目前为止,我的控制台返回我:

XML Parsing Error: syntax error

这是我的应用程序.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 驱动程序的二进制类(,从数据库中检索它,然后将其写入磁盘上的新文件。

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(中可能是最常见的。然后,他们只需在数据库中存储指向该文件的链接,并使用链接检索该文件。你可以做任何你觉得更舒服的事情。

最新更新