我是Node.js的新手.任何人都可以提供一个如何使用GridFS来存储和检索使用Node.js和Mongoose的二进制数据(如图像)的示例吗?我需要直接访问GridFS吗?
我试图找出如何将图像直接发布到GridFS而不将其作为临时文件存储在服务器上的任何位置.
我使用Postman(chrome ext.)发布文件,我设法将此帖子存储为文件,使用:
req.pipe(fs.createWriteStream('./test.png'));
Run Code Online (Sandbox Code Playgroud)
当从服务器上的文件创建readStream时,我还能够从readStream直接存储到GridFS.(见代码)
我有以下文件,saveFromReq.js它们监听POST,基本上只是将其传递给savePic.js.
saveFromReq.js:
var express = require('express');
var app = express();
var savePic = require('./savePic');
var fs = require('fs');
var GridStore = require('mongodb').GridStore;
var pic = './square.png';
var picID;
//When the following
//var pic = fs.createReadStream('./square.png', {autoClose: true});
//is not commented out, and 'req' is replaced with 'pic' in the savePic function,
//the file square.png is stored correctly to GridFS
app.post('/picture', function(req, res){
savePic(req, function(id){});
res.writeHead(200, {'Content-Type': 'text' });
res.end("Sucsess!\n");
});
app.listen(process.env.PORT …Run Code Online (Sandbox Code Playgroud) 我最近发现了GridFS,我想将其用于带元数据的文件存储.我只是想知道是否可以使用a MongoRepository来查询GridFS?如果是的话,有人可以举个例子吗?
如果有的话,我也会使用Hibernate来解决问题.
原因是:我的元数据包含许多不同的字段,查询存储库比new Query(Criteria.where(...))为每个方案编写一些更容易.我希望也可以简单地使用Java对象并通过REST API提供它而不需要文件本身.
编辑:我正在使用
简而言之:如果您有大量不同大小的文档,那么相对较少的文档达到最大对象大小,那么在MongoDB中存储这些文档的最佳做法是什么?
我有一组文件,如:
{_id: ...,
values: [12, 13, 434, 5555 ...]
}
Run Code Online (Sandbox Code Playgroud)
值列表的长度因文档的不同而异.对于大多数文档来说,它会有一些元素,少数元素会有数千万个元素,我将在MongoDB中达到最大对象大小限制.麻烦是我提出的任何特殊解决方案,因为那些非常大(而且相对较少)的文档可能会影响我如何存储小文档,否则这些文档会在MongoDB集合中幸福地生活.
据我所知,我有以下选择.我将不胜感激任何关于这些的优点和缺点的输入,以及我错过的任何其他选项.
1)使用另一个数据存储:这似乎太激烈了.我喜欢MongoDB,并不像我达到许多对象的大小限制.在单词的情况下,我的应用程序可以不同地处理非常大的对象和其他对象.它似乎并不优雅.
2)使用GridFS存储值:像传统数据库中的blob一样,我可以保留文档中前几千个值的元素,如果列表中有更多元素,我可以将其余的元素保存在GridFS对象中二进制文件.我无法在这部分进行搜索,但我可以忍受这一点.
3)滥用GridFS:我可以将每个文档保存在gridFS中.对于大多数(小)文档,二进制块将为空,因为文件集合将能够保留所有内容.其余的我可以将多余的元素保留在块集合中.与选项#2相比,这是否会带来开销?
4)真的滥用GridFS:我可以使用GridFS的文件集合中的可选字段来存储值中的所有元素.GridFS是否也为文件集合进行智能分块?
5)使用额外的"关系"集合来存储一对多关系,但此集合中的许多文档很容易超过一千亿行.
你能告诉像Ngix这样的流媒体服务器来流式传输存储在GridFS中的视频吗?如果是,它会影响性能吗?
我想知道哪个更好/更快:
我打算开发一个具有以下功能的独立的Restful Image Server,但首先想知道开源世界中是否存在类似的东西(语言并不重要):
不起作用:
考虑进入Mongo GridFS路线,几乎免费获得MongoDb分片和复制.把Nginx的前面,也许(部分)直接使用nginx的,GridFS的(见下文)应允许休息-东西,并与一些配置,一些简单的缓存,如果GridFS的无法处理本身(不知道)
资料来源:
nginx-gridfs http://www.coffeepowered.net/2010/02/17/serving-files-out-of-gridfs/
的懒惰变得理念(和一个简单的实现的正是我要找的,但它似乎不是一个积极的维护项目的更多hobbyish) http://sumitbirla.com/2011/11/how-to-build-a-scalable -caching调整大小图像服务器/
其他接近的东西,但不是最终的解决方案 https://github.com/adamdbradley/foresight.js/wiki/Server-Resizing-Images
有什么事情已经做到了吗?
我有这个错误信息:
(node:11976) DeprecationWarning: GridStore is deprecated, and will be removed in a future version. Please use GridFSBucket instead
Run Code Online (Sandbox Code Playgroud)
有时我无法查看图片,我想正因为如此,由于文档不佳,我不知道如何将我的代码切换到 GridFSBucket,就是这样:
conn.once("open", () => {
// Init stream
gfs = Grid(conn.db, mongoose.mongo);
//gfs = new mongoose.mongo.GridFSBucket(conn.db);
gfs.collection("user_images");
});
var storageImage = new GridFsStorage({
url: dbURI,
options: { useNewUrlParser: true, useUnifiedTopology: true },
file: (req, file) => {
return new Promise((resolve, reject) => {
crypto.randomBytes(16, (err, buf) => {
if (err) {
return reject(err);
}
const filename = buf.toString("hex") + path.extname(file.originalname);
const …Run Code Online (Sandbox Code Playgroud) 我使用GridFS存储在MongoDB中的文件.我需要从JavaScript shell中删除ID中的一些文件.我需要使用它的ID删除单个文件.我想我可以这样做:
db.fs.files.remove({_id: my_id});
Run Code Online (Sandbox Code Playgroud)
这在某种程度上起作用; 它从fs.files集合中删除文件,但不从集合中删除块本身fs.chunks.我知道的原因是因为我在RockMongo之前和之后检查了两个集合的长度.
我可以浏览一下块并删除那些引用该文件的内容,但有没有更好的内置方法呢?
以下行将从指定的url变量下载图像文件:
var filename = path.join(__dirname, url.replace(/^.*[\\\/]/, ''));
request(url).pipe(fs.createWriteStream(filename));
Run Code Online (Sandbox Code Playgroud)
这些行将获取该图像并保存到MongoDB GridFS:
var gfs = Grid(mongoose.connection.db, mongoose.mongo);
var writestream = gfs.createWriteStream({ filename: filename });
fs.createReadStream(filename).pipe(writestream);
Run Code Online (Sandbox Code Playgroud)
链接pipe像这样抛出错误:500无法管道.不可管.
request(url).pipe(fs.createWriteStream(filename)).pipe(writestream);
Run Code Online (Sandbox Code Playgroud)
发生这种情况是因为图像文件还没有准备好被读取,对吧?我该怎么做才能解决这个问题?错误:500无法管道.不可管.
使用下面的:Node.js的0.10.10,猫鼬,要求和GridFS的流库.