【问题标题】:can't get pictures from gridFS using Tornado无法使用 Tornado 从 gridFS 获取图片
【发布时间】:2012-08-13 16:34:08
【问题描述】:

我的问题是我可以将保存图片保存到 gridFS,即使它在那里,我已经验证,它会从控制台向我显示 pure 及其名称和大小。 这是代码:

conn = 连接()

保存到数据库的类:

类配置文件(tornado.web.RequestHandler):

def post(self):
      self.db = conn["essog"]
      avat = self.request.files['avatar'][0]["body"]
      avctype = self.request.files['avatar'][0]["content_type"]
      nomfich = self.request.files['avatar'][0]["filename"]
      #..operation using PIL to decide to save the picture or not
      self.fs = GridFS(self.db)
      avatar_id = self.fs.put(avat, content_type=avctype, filename=nomfich) #change the   name later to avoid delete using the same name, so generating a different name...
      .....
      user={..., "avatar":avatar_id}
      self.db.users.insert(user)
      self.db.users.save(user)

从数据库中读取的类:

类Profil(tornado.web.RequestHandler):

  def get(self):
      self.db = conn["essog"]
      self.fs = GridFS(self.db)
      avatar_id = self.db.users.find_one()["avatar"]
      ...
      avatar = self.fs.get(avatar_id).read()
      self.render("profile.html",..., avatar=avatar)

并在视图中(profile.html)

img src="{{头像}}" />

但什么都没有显示!

【问题讨论】:

    标签: mongodb tornado gridfs


    【解决方案1】:

    除非您想使用 base64 URI 作为图像的来源,否则您应该使用 url,然后创建一个视图以从该视图返回数据。如果您使用的是 nginx,您可能会对 nginx-gridfs 模块感兴趣,以获得更好的性能。

    【讨论】:

    • 对不起,我不明白这个?!为什么在正常情况下我只能显示图像源路径并且它会好的,它在处理数据库时不是sace?
    • 我明白我必须将它重新保存到目录吗? groups.google.com/group/mongodb-user/browse_thread/thread/…
    • 不 - 它只是你在图像的 src 中输出图像的内容 - 如果你这样做,你必须使用数据 uri。通常,您将提供一个 URL,该 URL 将返回带有内容类型数据的内容和标头
    • heu...对不起,但我是初学者,这是我第一次看到这个,我没有理解维基百科中给出的例子,你能用想象的“avatar_id”给我解释一个简单的例子吗" ?
    • 这是另一个我没有得到的答案:grokbase.com/t/gg/mongodb-user/126ngn7vsa/… 他说:“序列化二进制文件也会增加它们的大小(base64 大约增加 30%),并且需要处理能力来插入和检索文件。”
    【解决方案2】:

    img 标记的 src 属性(通常)不包含图像数据本身,而是包含图像的 URL。我认为您混淆了两个单独的请求和响应:

    1. 包含<img src="..." /> 标签的HTML 页面:

      class Profil(tornado.web.RequestHandler):
          self.render('profile.html',
              avatar=self.reverse_url('avatar', avatar_id))
      
    2. 图像本身(需要单独的处理程序):

      class Avatar(tornado.web.RequestHandler):
          def get(self, avatar_id):
              avatar = self.fs.get(avatar_id)
              self.set_header('Content-Type', avatar.content_type)
              self.finish(avatar.read())
      

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-30
    • 2015-07-13
    • 2011-09-18
    • 2012-09-15
    • 1970-01-01
    • 2020-02-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多