检索存储在我的 Mlab 中的音频 - 二进制文件
Posted
技术标签:
【中文标题】检索存储在我的 Mlab 中的音频 - 二进制文件【英文标题】:Retrieve audio - binary file- stored in my Mlab 【发布时间】:2018-11-05 04:56:10 【问题描述】:基本上,我已经使用 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)
谢谢。
【问题讨论】:
【参考方案1】:对于小于 16 MB 的文件,您不需要 GridFS。您可以使用 BSON's binary type 将二进制数据直接存储在 MongoDB 中,也可以对二进制数据进行编码并将其存储为字符串。将二进制数据存储为字符串时,Base64 是一种常见的编码选择。
从数据库中检索数据后,您可以使用fs.writeFile
将其写入文件。
如果您将数据保存为二进制类型,则可以将buffer 传递给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)中可能是最常见的。然后他们只需将指向该文件的链接存储在数据库中并使用该链接检索该文件。你可以做任何你觉得更舒服的事情。
【讨论】:
哇,谢谢你的完整答案,我会测试一下 嗨 tfogo,我有一个问题,用 MongoDB 将数据转换为二进制数据似乎比 mongoose 更容易?我很难使用猫鼬将数据转换为二进制文件。我会测试你的 MongoDB 方法。 差不多一样——在mongoose模式中使用Buffer类型,只是传入一个buffer作为对象。您可以在 Mongoose 文档中看到一个示例:mongoosejs.com/docs/schematypes.html以上是关于检索存储在我的 Mlab 中的音频 - 二进制文件的主要内容,如果未能解决你的问题,请参考以下文章