7

我正在尝试使用 tornado 和 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)  

它工作正常,“头像”被保存,但没有图像,它只保存一个名字!

我的问题是:

  • 要了解数据库如何处理图片,我必须制作 image.save(path, format),但路径是普通系统路径(windows 还是 linux)的路径?
  • 配置文件很简单,我将图片上传限制为500ko,而mongodb中的文档为16mb,因此该文档将处理整个配置文件,但是当包含图片时,即使对于小文档,我也必须使用gridFS吗?关键问题是图片保存的路径,卡住了,这是我第一次处理数据库,所以很抱歉这个问题。
4

4 回答 4

18

您不一定需要 GridFS 来在 MongoDB 中存储文件,但它肯定会带来更好的体验,因为它可以处理二进制数据的拆分和保存,同时使元数据也可用。然后,您可以将User文档中的 ID 存储到头像图片中。

除此之外,您还可以将二进制数据直接存储在您的文档中,尽管在您的代码中您并没有保存数据。你只是用它打开它PIL.Image,然后什么都不做。

假设您正在使用pymongo您的驱动程序,我认为您可以做的就是将二进制数据包装在一个Binary容器中,然后存储它。这未经我测试,但我认为它应该可以工作:

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
    ...
}
于 2012-08-11T18:22:28.287 回答
14

这是在不使用 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)
于 2013-12-31T12:28:44.977 回答
3

有一个错误:

          from pymongo.binary import Binary

正确的语法是:

          from bson.binary import Binary

谢谢大家的支持

卢卡

于 2015-07-09T06:25:17.600 回答
0

您需要使用 pymongo 的 Binary() 数据类型保存二进制数据。

http://api.mongodb.org/python/2.0/api/bson/binary.html#module-bson.binary

于 2012-08-11T18:20:57.403 回答