我正在尝试使用龙卷风和pil和mongodb这样做。
avat = self.request.files['avatar'][0]["body"]
nomfich = self.request.files['avatar'][0]["filename"]
try:
image = Image.open(StringIO.StringIO(buf=avat))
size = image.size
type = image.format
avatar = r"/profile-images/{0}/{1}".format(pseudo, nomfich)
except IOError:
self.redirect("/erreur-im")
和数据库代码:
user={
"pseudo": pseudo,
"password":password,
"email":email,
"tel":tel,
"commune":commune,
"statut":statut,
"nom":nom,
"prenom":prenom,
"daten":daten,
"sexe":sexe,
"avatar":avatar
}
self.db.essog.insert(user)
它工作正常,“头像”被保存,但没有图像,它只保存一个名字!
我的问题是:
答案 0 :(得分:15)
您不一定需要GridFS来存储MongoDB中的文件,但它肯定会使它成为更好的体验,因为它可以处理二进制数据的拆分和保存,同时使元数据也可用。然后,您可以将User
文档中的ID存储到头像图片中。
除此之外,您还可以直接在文档中存储二进制数据,但在您的代码中,您不会保存数据。您只需使用PIL.Image
打开它,但随后无法使用它。
假设您使用pymongo
作为驱动程序,我认为您可以做的只是将二进制数据包装在Binary
container中,然后存储它。这是我未经测试的,但我认为它应该有效:
from pymongo.binary import Binary
binary_avatar = Binary(avat)
user={
...
"avatar":avatar,
"avatar_file": binary_avatar
...
}
现在被说......只是让自己更轻松并使用GridFS。这就是它的意思。
如果您使用GridFS,它可能如下所示:
from gridfs import GridFS
avat_ctype = self.request.files['avatar'][0]["content_type"]
fs = GridFS(db)
avatar_id = fs.put(avat, content_type=avat_ctype, filename=nomfich)
user={
...
"avatar_name":avatar,
"avatar_id": avatar_id
...
}
答案 1 :(得分:9)
这是在不使用gridfs的情况下在mongodb中插入和检索图像的代码。
def insert_image(request):
with open(request.GET["image_name"], "rb") as image_file:
encoded_string = base64.b64encode(image_file.read())
print encoded_string
abc=db.database_name.insert({"image":encoded_string})
return HttpResponse("inserted")
def retrieve_image(request):
data = db.database_name.find()
data1 = json.loads(dumps(data))
img = data1[0]
img1 = img['image']
decode=img1.decode()
img_tag = '<img alt="sample" src="data:image/png;base64,{0}">'.format(decode)
return HttpResponse(img_tag)
答案 2 :(得分:1)
出现错误:
from pymongo.binary import Binary
正确的语法是:
from bson.binary import Binary
感谢大家的无尽支持
卢卡
答案 3 :(得分:0)
尝试使用carierwave-mongoid https://github.com/jnicklas/carrierwave-mongoid 在这种情况下,我认为这对你来说简单易行
答案 4 :(得分:0)
您需要使用pymongo的Binary()数据类型保存二进制数据。
http://api.mongodb.org/python/2.0/api/bson/binary.html#module-bson.binary