2009-04-18 61 views
1

我有點卡住我的代碼:如何在db中存儲應用引擎Image對象?

def setVenueImage(img): 
    img = images.Image(img.read()) 
    x, y = photo_utils.getIdealResolution(img.width, img.height) 
    img.resize(x, y) 
    img.execute_transforms() 
    venue_obj = getVenueSingletonObject() 
    if venue_obj is None: 
     venue_obj = Venue(images = [img]) 
    else: 
     venue_obj.images.append(img) 
    db.put(venue_obj) 

我使用Django與App Engine - 所以img.read()工作正常。

事實上,所有這些代碼工作正常,直到我嘗試將img存儲到數據庫中。我的模型預計的Blob,所以當我把圖像IMG中,那麼它拋出一個合適的,我也得到:

BadValueError在/管理/場地/ 項目中的圖像列表都必須斑點實例

好吧,所以一個圖像不能是一個Blob,但那我該如何使它成爲一個blob? Blob接受一個字節字符串,但是如何讓我的圖像成爲一個字節字符串?

我沒有在這個文檔中看到的任何地方,他們實際上使用圖像對象,所以我不知道這是怎麼應該工作,但我想用圖像對象來調整圖片的大小(我知道你可以在PIL中做到這一點,但我想知道如何用谷歌的Image類來做到這一點)。

感謝您的指點:)

回答

2

這可能會工作:

def setVenueImage(img): 
    img = images.Image(img.read()) 
    x, y = photo_utils.getIdealResolution(img.width, img.height) 
    img.resize(x, y) 
    img_bytes = img.execute_transforms() # Converts to PNG 
    venue_obj = getVenueSingletonObject() 
    if venue_obj is None: 
     venue_obj = Venue(images = [img_bytes]) 
    else: 
     venue_obj.images.append(img_bytes) 
    db.put(venue_obj) 

我假設Venue.images是一個ListProperty(db.Blob),對嗎?這可能是錯誤的做法。使用簡單的blob屬性定義VenueImage模型並將其密鑰存儲到Venue中。如果您直接將圖像放在那裏,您將達到數據存儲上的1MB行限制。

+0

感謝您的意見:) – 2009-05-24 08:56:32

2

我不滿意這個解決方案,因爲它沒有一個圖片對象轉換爲BLOB,但它會暫時做:

def setVenueImage(img): 
    original = img.read() 
    img = images.Image(original) 
    x, y = photo_utils.getIdealResolution(img.width, img.height) 
    img = images.resize(original, x, y) 
    venue_obj = getVenueSingletonObject() 
    if venue_obj is None: 
     venue_obj = Venue(images = [db.Blob(img)]) 
    else: 
     venue_obj.images.append(db.Blob(img)) 
    db.put(venue_obj) 
+0

你在這裏做什麼是完全正確的。 Blob只是一個字符串子類,你需要做的就是像這裏一樣構造一個。 – 2009-04-18 08:19:10

相關問題