【问题标题】:saving picture to mongodb将图片保存到mongodb
【发布时间】:2012-08-08 14:07:15
【问题描述】:

我正在尝试使用 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吗? 关键问题在图片保存的路径上,卡住了,我是第一次处理数据库,所以很抱歉这个问题。

【问题讨论】:

  • 我不能完全理解你想要做什么。 avatar 看起来像一个文件路径名,我没有看到它用于实际保存上传的图像,我也没有看到你试图将图像字节保存为 user 文档的一部分。
  • 正确格式化源代码
  • @JohnnyHK 抱歉,因为我只上传了代码片段,抱歉耽搁了,下面的答案给了我解释:D 谢谢 :)

标签: mongodb python-imaging-library tornado


【解决方案1】:

有一个错误:

          from pymongo.binary import Binary

正确的语法是:

          from bson.binary import Binary

感谢大家一直以来的支持

卢卡

【讨论】:

    【解决方案2】:

    这是在不使用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)
    

    【讨论】:

    • 在这个例子中,request.GET["image_name"] 是一个包含文件系统上文件路径的字符串吗?如果是这样,那么上传图像的步骤呢?我想要一个上传机制,直接插入 mongodb,处理内存中的上传,从不将文件写入磁盘。
    • 好的,我想通了;但是你dumpsloads 数据然后再次解码是否有原因?我发现我可以简单地使用data = db.collection.find(); imgdata = data[0]['image']; imgtype = data[0]['type'];(我保存了content_type)然后返回HttpResponse('&lt;img src="data:{};base64,{}" /&gt;'.format(imgtype, imgdata,无需再次解码。只是好奇retrieve_image fn 中是否有转储/加载/解码的原因
    【解决方案3】:

    您不一定需要 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
        ...
    }
    

    【讨论】:

    • 哇!这就是我搜索的内容!因为配置文件将使用简单文档,但用户上传将使用 gridFS,我将添加密钥以在它们之间进行一些“加入”。再次感谢您并检索数据,我想我会使用 binary_avatar 变量!谢谢!
    • 是的,要再次检索,您只需使用该 ID 执行“获取”,该 ID 将作为“avatar_id”存储在用户配置文件中
    • 嗨,我已经尝试了代码并且它有效,不知道它是否是一个错字,但它来自 bson.binary 而不是 pymongo.binary 和 get,对 gridfs 和二进制都有效吗?
    • Pymongo 使用 bson,因此它来自 bson 模块。不,如果您使用二进制方法并将其直接放在用户文档中,那将是完全不同的。它只是文档中的二进制 blob。它没有特定的 id。 Gridfs 会给你一个 ID 作为在你的用户文档中使用的参考。
    • 您需要 PIL 进行转换,例如制作缩略图。这些新的缩略图也必须存储在 GridFS 中。对于我的一个站点,我存储了主图像,然后将该 ID 作为父 ID 添加到缩略图的 gridfs 元数据中。没有系统文件路径,因为您使用的是不同的存储机制。为了为它们提供服务,您可以创建一个简单的视图,从 ID 提供图像。对于生产,我使用 nginx 的 gridfs 插件,让它们直接服务。然后它不通过django。 django 视图仅供开发人员使用。
    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-13
      • 2017-11-29
      • 2010-09-15
      • 1970-01-01
      • 2020-12-17
      相关资源
      最近更新 更多