2012-10-23 22 views
0

每次用戶訪問http://www.example.com/some-random-symbols-1x1.png,我都應該返回透明圖像1x1px。我已經創建了根據文件,但我應該如何在我的代碼中讀取它以返回給用戶?我知道如何顯示來自數據存儲或blobstore的圖像。但不知道如何讀取和返回二進制文件。如何用GAE返回圖像?

它不能是靜態文件由於以下原因:

  1. 網址將包含一些隨機的符號;
  2. 一旦訪問網址,在顯示圖像之前,我想記錄某人訪問了該文件。
+0

它可以是靜態的。您可以擁有一個處理程序,該處理程序爲與給定正則表達式匹配的任何URL提供該映像,並且服務器已經記錄了對靜態文件的訪問。 – geoffspear

+0

謝謝,@Wooble。好的,明白了。但日誌不是我所需要的。我想使用該文件被訪問的標誌來更新數據存儲記錄。我想我不能用靜態文件來做。 –

+0

您可以運行一個cron作業並運行日誌以檢查它是否已被訪問。 – bossylobster

回答

1

在更一般的情況下,我會使用Blob存儲區和BlobstoreDownloadHandler,但對於一個微小的GIF圖片,肯定會裝入內存,這樣的事情來讀取文件的內容:

with open('path/to/file.gif') as f: 
    img_content = f.read() 

我會把它放在我的處理程序之外,因此每個實例都會執行一次。如果您使用的是2.5,那麼您需要從將來導入'with',或者自己打開和關閉文件。

然後在處理程序中,假定webapp2的:

self.response.content_type = 'image/gif' 
self.response.write(img_content) 
+0

Greg,在開發環境中工作良好,但在生產中不起作用 - 我得到了:[Errno 2]沒有這樣的文件或目錄:'templates/img/1x1.gif' '。任何想法如何解決這個問題? –

+0

是由你的一個靜態路由匹配的templates/img?匹配其中一個'upload:'行的目錄中的文件不會被部署到應用程序服務器(python運行的地方)。 – Greg

3

一個1x1透明PNG(或GIF)足夠小,就可以硬編碼Base64表示直接和通過self.response.write()直接發射它(解碼後) 。

每次從磁盤讀取都相對昂貴。如果你想走那條路,就懶洋洋地初始化一個全局變量。

+0

謝謝!基於http://stackoverflow.com/questions/5368669/convert-base64-to-image-in-python我發現如何做到這一點。 –