【问题标题】:Image which is stored as a blob in Datastore in a html page在 html 页面中作为 blob 存储在 Datastore 中的图像
【发布时间】:2014-03-26 06:53:19
【问题描述】:

我正在尝试在 python 中制作基于 Google App Engine 的 Web 应用程序。其中一部分涉及显示在 IMDb 上托管的电影海报。我有海报的链接。例如。 http://ia.media-imdb.com/images/M/MV5BNTM3OTc0MzM2OV5BMl5BanBnXkFtZTYwNzUwMTI3._V1._SX94_SY140_.jpg

然后我试着把它放在一个 HTML 页面中:

<a href="https://ia.media-imdb.com/images/M/MV5BNTM3OTc0MzM2OV5BMl5BanBnXkFtZTYwNzUwMTI3.jpg">
<img src="https://ia.media-imdb.com/images/M/MV5BNTM3OTc0MzM2OV5BMl5BanBnXkFtZTYwNzUwMTI3.jpg">
</a>

在此处查看示例:

图片未显示,点击后会打开一个页面:

推荐被拒绝

您无权访问此服务器上的“https://ia.media-imdb.com/images/M/MV5BNTM3OTc0MzM2OV5BMl5BanBnXkFtZTYwNzUwMTI3.jpg”。

参考#24.84d81002.1393249598.981ca7

通过this 问题,我知道IMDb 不允许推荐到任何其他网站。解决方案是自己获取图像,保存,然后自己提供。 为此,我关注了this link

我创建了一个数据存储对象,用于存储电影的各种信息以及使用 urlfetch api 获取的海报。代码的相关部分是

from google.appengine.ext import db
from google.appengine.api import urlfetch

class Movie(db.Model):
    title = db.StringProperty()
    poster = db.BlobProperty(default=None)

coverurl = "https://ia.media-imdb.com/images/M/MV5BNTM3OTc0MzM2OV5BMl5BanBnXkFtZTYwNzUwMTI3.jpg"
movie = Movie()
posterimg = urlfetch.fetch(coverurl).content
movie.cover = db.Blob(posterimg)
movie.put()

现在,为了渲染 html 页面,我从数据存储中获取了电影对象

m = Movie.gql("WHERE title = :1", title).get()
img = m.posterimg

html 页面呈现为

imghtml = ' <img src="' + img + '"> </a>'

一个错误是预期的,并被接收为:

UnicodeDecodeError:“ascii”编解码器无法解码位置 0 中的字节 0xff:序数不在范围内 (128)

解决这个问题的方法是什么? 如何在 html 图像中包含作为 blob 存储在 Datastore 中的图像?

【问题讨论】:

  • 我希望你不是说你在未经许可的情况下从他们的网站上窃取图像。
  • 如果他们自己允许访问我们,这算不算偷窃?
  • 访问不等于复制。如果您在未经所有者许可的情况下复制图像,您将违反版权法。

标签: html image google-app-engine blob google-cloud-datastore


【解决方案1】:

提供的动态图像是一个旧链接。今天我们提供 Google 高性能图片服务。 如何使用:

  1. 将图片上传到 blobstore
  2. 使用App引擎图片服务,获取服务url:
  3. 将他的服务网址放入您的 HTML 中

示例:serving_url = images.get_serving_url(blob_key, size=None, secure_url=True)

文档:https://developers.google.com/appengine/docs/python/blobstore/#Python_Uploading_a_blob

示例投放网址:https://lh6.ggpht.com/lOghqU2JrYk8M-Aoio8WjMM6mstgZcTP0VzJk79HteVLhnwZy0kqbgVGQZYP8YsoqVNzsu0EBysX16qMJe7H2BsOAr4j=s70

【讨论】:

  • 如何获取图像的 blob_key?我正在将图像上传到数据存储区,而不是 Blobstore。有没有办法将数据存储条目链接到 blobstore 条目?
  • 如果您上传 blob,您会收到 blobkey。 blobkey 是 blobinfo 的一部分。所以你可以使用 blobinfo 实例和 key()。
【解决方案2】:

使用应用引擎助手将图像上传到 blobstore,在同一处理程序中获取 serving_url,将 serving_url 与您的图像对象一起保存,参考您的 html 模板中的图像 url

例如

from google.appengine.ext.webapp import blobstore_handlers
from google.appengine.api.images import get_serving_url

class Handler(blobstore_handlers.BlobstoreUploadHandler):
    def post(self):
        upload_files = self.get_uploads('file')
        blob_info = upload_files[0]
        img = MyImageObject()
        img.image_name = blob_info.filename
        img.image_url = get_serving_url(blob_info.key())
        img.put()

然后在模板中

<img src="{{img.image_url}}">

要获得图像的原始大小,您需要将 =s0 附加到 url 的末尾,附加 =sXX 以调整大小,请参阅此处的“URL 修改”部分 https://developers.google.com/appengine/docs/python/images/functions

【讨论】:

    【解决方案3】:

    试试这个

    echo '<img src="data:image/jpeg;base64,' . base64_encode( $row['imageContent'] ) . '" />';
    

    【讨论】:

    • 我无法理解您提供的语法。原谅我的无知。什么是 > 。 base64_encode($row['imageContent']) 。 ?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-21
    • 2013-07-19
    • 2019-04-03
    • 2014-04-30
    • 2013-04-17
    • 1970-01-01
    相关资源
    最近更新 更多