我是 mongoDB 和 gridfs 的初学者。我有一个代码可以在数据库中保存传入的图像。但我想在保存之前调整图像的大小。它尝试使用 Sharp,但我不太明白它是如何工作的。
我尝试了以下代码,但它不起作用
const storage = new GridFsStorage({
url: mongoURI,
file: (req, file) => {
return new Promise((resolve, reject) => {
const filename = req.params.userID;
const fileInfo = {
filename: filename,
bucketName: "ProfilePic",
};
resolve(fileInfo);
});
}
});
const upload = multer({ storage });
router.post("/setProfilePic/:userID", upload.single("picture"), async(req, res) => {
//code not working
await sharp(req.file.path)
.resize(500)
.jpeg({quality: 50})
.toFile(
path.resolve(req.file.destination,'resized',image)
)
// end of non working code
return res.status(200).json({state: "ok"})
});
Run Code Online (Sandbox Code Playgroud) 因此,我使用 MongoDB Atlas、Mongoose、Multer 和 GridFsStorage 将文件上传到云上的单个数据库,效果很好,但我希望能够动态使用不同的数据库连接将文件上传到不同的数据库。
为此,我想设置 Multer GridFsStorage 配置,以便“db”属性字段根据 API 请求动态更改。但是,我无法访问“db”属性内的 HTTP 请求对象,这使得我可以动态更改数据库连接。GridFsStorage 配置对象中的
“db”属性仅接受以下内容:
在下面的示例中,您可以看到我正在使用自定义 getDatabaseConnection() 方法创建数据库连接,然后将该连接传递到接受单个静态数据库连接的数据库字段中。
// Multer GridFsStorage configuration.
const storage = new GridFsStorage({
// I NEED TO CHANGE THE DB CONNECTION DYNAMICALLY TO UPLOAD FILES TO DIFFERENT
// DATABASES, BUT I HAVE NO ACCESS TO THE HTTP REQUEST OBJECT INSIDE THE DB FIELD!
db: connectionFactory.getDatabaseConnection(process.env.DB_CONNECT),
// I can access the request object (req) inside the "file" field.
file: …Run Code Online (Sandbox Code Playgroud) GridFS C#驱动程序的最佳实现是什么?你有什么经历?
更新:
当我说"最好"时 - 我的意思是稳定性.
谢谢!!!
我使用mongodb并将文件保存到gridfs
现在我想从gridfs编辑图像...
我用这个代码
def thumbnail(file_obj):
import StringIO
from PIL import Image
im = StringIO.StringIO()
im.write(file_obj.raw_file)
im_ful = Image.open(im)
return im_ful.info
Run Code Online (Sandbox Code Playgroud)
但是pil说"无法识别图像文件"
那个图像也;)如何解决它
是否可以直接将图像存储到mongo GridFS中,这是我从API获得的?或者我必须在本地存储然后将其插入mongo?
我试图直接从URL插入,但C#驱动程序给了我一个错误,不支持URI ..
我正在使用nodejs mongodb mongoose和gridfs.当我试图通过它获取一个文件的filname everthing工作得很好,如果我想通过id得到它我得到错误:你想要阅读的文件不存在.我在下面的代码console.log("res.pic_id:"+ res.pic_id)我得到了正确的ObjectId.这是代码:
var GridFS = require('GridFS').GridFS;
var myFS = new GridFS('db');
var fs = require('fs')
var Profile = db.model('Profile');
Profile.findOne({'_id' : clientID},['_id', 'username','pic_id','pic_filename'],function(err, res){
if (err) {
console.log("ERROR serching user info: " + err);
callback(JSON.stringify(JSONRes(false, err)));
}
else {
if (res) {
console.log("res.pic_id : " + res.pic_id);
myFS.get(res.pic_id,function(err,data){
if (err)
console.log("ERROR "+err)
else {
callback(data);
}})
};
}
else {
callback(JSON.stringify(JSONRes(false, err)));
}
}
})
Run Code Online (Sandbox Code Playgroud)
谢谢!
我在sails.js应用程序中使用gridfs将图像上传到服务器.我的上传代码如下
upload: function (req, res) {
req.file('avatar')
.upload({
adapter: require('skipper-gridfs'),
uri: 'mongodb://localhost:27017/dbname.images'
}, function whenDone(err, uploadedFiles) {
if (err) return res.negotiate(err);
else return res.ok({
files: uploadedFiles,
textParams: req.params.all()
});
});
}
Run Code Online (Sandbox Code Playgroud)
我得到以下回应......
{
"files": [
{
"fd": "2d8910a0-8ca2-4df1-9930-6ddd721a0416.jpg",
"size": 172883,
"type": "image/jpeg",
"filename": "Photo on 12-20-14 at 9.53 PM.jpg",
"status": "bufferingOrWriting",
"field": "avatar",
"extra": {
"fileId": "54aee6ced4a0e88f0dc9025f",
"fd": "2d8910a0-8ca2-4df1-9930-6ddd721a0416.jpg",
"dirname": "."
}
}
],
"textParams": {}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,如果我需要下载上面上传的文件,我该怎么办?我在互联网上获得了以下代码来下载任务,但这对我来说没有多大意义.基本上我想要上传图片的下载网址,我可以使用移动应用程序中的网址来显示图片.
var blobAdapter = require('skipper-gridfs')({
uri: 'mongodb://localhost:27017/dbname.images'
});
blobAdapter.read(filename, callback);
Run Code Online (Sandbox Code Playgroud)
有人可以帮我这个吗?提前致谢.
我有一个png应该转换为jpg并保存到的文件gridfs,我使用python的PILlib加载该文件并执行转换工作,问题是我想将转换后的图像存储到MongoDB Gridfs中,在保存过程中,我可以只需使用该im.save()方法。所以我用a StringIO来保存临时文件,但是不起作用。
这是代码片段:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from PIL import Image
from pymongo import MongoClient
import gridfs
from StringIO import StringIO
im = Image.open("test.png").convert("RGB")
#this is what I tried, define a
#fake_file with StringIO that stored the image temporarily.
fake_file = StringIO()
im.save(fake_file,"jpeg")
fs = gridfs.GridFS(MongoClient("localhost").stroage)
with fs.new_file(filename="test.png") as fp:
# this will not work
fp.write(fake_file.read())
# vim:ai:et:sts=4:sw=4:
Run Code Online (Sandbox Code Playgroud)
我对python的IO机制非常了解,如何使这项工作有效?
我正在使用Grid保存并将二进制数据加载到mongoDB数据库.我正在使用nodejs.按照我能够找到的所有示例(非常相似),我的代码是:
router.get('/getlog',function(req,res) {
if (req.isAuthenticated())
{
var mongo = require('mongodb');
var Grid = require('gridfs-stream');
var db = new mongo.Db('logApp', new mongo.Server("127.0.0.1", 27017));
db.open(function (err) {
if (err) {
return handleError(err);
}
var gfs = Grid(db, mongo);
var readStream = gfs.createReadStream({
_id: req.query.id
}).pipe(res);
});
}
else
res.redirect('/home');
});
Run Code Online (Sandbox Code Playgroud)
req.query.id是我需要的文件的id.我得到的回应是:
MongoError: file with id 557aa98e6f1373cb11e8f294 not opened for writing
Run Code Online (Sandbox Code Playgroud)
这没有任何意义,因为我不写,我正在读文件.
我需要从GridFS下载一个简历,下面是我写的代码,但是这似乎没有给我一个物理文件供下载,这用于阅读内容.我该如何下载文件?
exports.getFileById = function(req, res){
var conn = mongoose.connection;
var gfs = Grid(conn.db, mongoose.mongo);
var id = req.params.ID;
gfs.exist({_id: id,root: 'resume'}, function (err, found) {
if (err) return handleError(err);
if (!found)
return res.send('Error on the database looking for the file.');
gfs.createReadStream({_id: id,root: 'resume'}).pipe(res);
});
};
Run Code Online (Sandbox Code Playgroud)