2014-02-24 77 views
0

我想在python中基於Google App Engine製作Web應用程序。其中的一部分涉及在IMDb上展示Movie的海報。我有鏈接到海報。例如。 http://ia.media-imdb.com/images/M/MV5BNTM3OTc0MzM2OV5BMl5BanBnXkFtZTYwNzUwMTI3._V1._SX94_SY140_.jpg在數據存儲區中作爲Blob存儲在html頁面中的圖像

然後我試圖把它放在一個HTML頁面:

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

在這裏看到的例子:

圖像ISN;噸顯示和點擊它,會打開一個頁面,指出:

Referral Denied

You don't have permission to access " https://ia.media-imdb.com/images/M/MV5BNTM3OTc0MzM2OV5BMl5BanBnXkFtZTYwNzUwMTI3.jpg " on this server.

Reference #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' codec can't decode byte 0xff in position 0: ordinal not in range(128)

這是什麼方法? 如何在數據存儲區中將圖像作爲Blob存儲在html圖像中?

+0

我希望你不是說你在未經允許的情況下從他們的網站上偷取了圖片。 –

+0

如果他們自己允許訪問我們,它會算作是偷竊嗎? – venky

+0

訪問與複製不同。如果您在未經所有者許可的情況下複製圖像,則違反版權法。 –

回答

1

上傳圖片使用App Engine助手BLOBSTORE,得到serving_url在相同的處理,保存serving_url與圖像對象,參考圖像網址在您的html模板中

eg

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,追加=隨心調整大小,請參閱「URL的修改」一節在這裏https://developers.google.com/appengine/docs/python/images/functions

2

服務動態圖像是一箇舊鏈接。今天我們有Google高性能圖片服務。 如何使用:

  1. 上傳圖片至Blobstore
  2. 使用App Engine圖像服務,獲取服務網址:
  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

+0

如何獲取圖像的blob_key?我將圖像上傳到數據存儲區,而不是Blobstore。有沒有辦法將數據存儲條目鏈接到blobstore條目? – venky

+0

如果你上傳一個blob,你會收到blobkey。 blobkey是blobinfo的一部分。所以你可以使用blobinfo實例和key()。 – voscausa

0

試試這個

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

我無法理解您提供的語法。請原諒我的無知。什麼是>。 base64_encode($ row ['imageContent'])。 ? – venky

相關問題