将照片保存到mongodb

时间:2012-08-11 15:04:21

标签: mongodb python-imaging-library 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(路径,格式),但是路径,它是正常系统路径(windows或linux)的路径吗?
  • 配置文件很简单,我将图片上传限制为500ko,mongodb中的文件是16mb,所以文件将处理整个配置文件,但是当它包含图片时,我必须使用gridFS即使是小文件吗? 关键问题在于图片保存的路径,卡住了,这是我第一次处理数据库,所以很抱歉这个问题。

5 个答案:

答案 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