将照片保存到mongodb

Abd*_* Pp 5 tornado mongodb python-imaging-library

我正在尝试使用龙卷风和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")
Run Code Online (Sandbox Code Playgroud)

和数据库代码:

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)  
Run Code Online (Sandbox Code Playgroud)

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

我的问题是:

  • 要了解数据库如何处理图片,我必须制作image.save(路径,格式),但是路径,它是正常系统路径(windows或linux)的路径吗?
  • 配置文件很简单,我限制图片上传到500ko,mongodb中的文件是16mb,所以文件将处理整个配置文件,但是当它包含图片时,我必须使用gridFS甚至小文件?关键问题在于图片保存的路径,卡住了,这是我第一次处理数据库,所以很抱歉这个问题.

jdi*_*jdi 17

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

除此之外,您还可以将二进制数据直接存储在文档中,但在代码中您不会保存数据.你只是打开它PIL.Image,但随后什么都不做.

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

from pymongo.binary import Binary

binary_avatar = Binary(avat)

user={
    ...
    "avatar":avatar,
    "avatar_file": binary_avatar
    ...
}
Run Code Online (Sandbox Code Playgroud)

现在说...只是让自己更容易并使用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
    ...
}
Run Code Online (Sandbox Code Playgroud)

  • 嗨,我已经尝试了代码,它工作,不知道它是否是一个错字,但它来自bson.binary而不是pymongo.binary和get,将适用于gridfs和二进制? (2认同)

Shi*_*iva 10

这是在不使用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)
Run Code Online (Sandbox Code Playgroud)