2012-05-12 19 views
0

我剛開始使用GAE Blobstore將圖像文件上傳到網絡應用程序。我一直在使用這些資源教程:如何在用戶表中使用GAE blobstore? (EntityNotFoundError)

http://blog.notdot.net/2010/03/Implementing-a-dropbox-service-with-the-Blobstore-API-Part-1 http://blueimp.github.com/jQuery-File-Upload/

在我的代碼下面BLOB將上傳到數據存儲的確定,我也可以檢索blob信息。然而,在可變延遲(也許5min +)之後,當我嘗試讀取blob信息時,我開始獲取EntityNotFoundErrors。 blob和UserFile數據仍然出現在_ah/admin/datastore界面中。

由於我是新開發blobstore,我想知道如果我使用blobstore.BlobReferenceProperty是好的?

預先感謝任何建議,

布賴恩

我用下面的數據結構,用戶記錄鏈接到斑點:

class UserFile(db.Model): 
    user = db.StringProperty(required=True) 
    blob_key = blobstore.BlobReferenceProperty(required=True) 

我寫這樣的斑點的DB(中用戶名通過self.get_username檢索到):

def write_blob(self, data, info): 
     blob = files.blobstore.create(
      mime_type=info['type'], 
      _blobinfo_uploaded_filename=info['name'] 
     ) 
     with files.open(blob, 'a') as f: 
      f.write(data) 
     files.finalize(blob) 

     # Add a userfile entry for this blob 
     key = files.blobstore.get_blob_key(blob) 
     userFile = UserFile(blob_key = key, user = self.get_username()) 
     userFile.put() 

最後,我取得這樣的BLOB信息:

def get_userFileTable(self): 
    username = self.get_username() 
    userfiles = db.GqlQuery("SELECT * " 
          "FROM UserFile " 
          "WHERE user = :1",username) 

    for userfile in userfiles: 
     filename = userfile.blob_key.filename 

的最後一行是在EntityNotFoundError拋出

File "\scripts\filemanager\upload_handler.py", line 188, in get_userFileTable filename = userfile.blob_key.filename 
File "C:\Program Files (x86)\Google\google_appengine\google\appengine\ext\blobstore\blobstore.py", line 179, in filename return self.__get_value('filename') 
File "C:\Program Files (x86)\Google\google_appengine\google\appengine\ext\blobstore\blobstore.py", line 243, in __get_value 
self.kind(), str(self.__key), namespace='')) 
File "C:\Program Files (x86)\Google\google_appengine\google\appengine\api\datastore.py", line 628, in Get 
return GetAsync(keys, **kwargs).get_result() 
File "C:\Program Files (x86)\Google\google_appengine\google\appengine\api\apiproxy_stub_map.py", line 592, in get_result 
return self.__get_result_hook(self) 
File "C:\Program Files (x86)\Google\google_appengine\google\appengine\datastore\datastore_rpc.py", line 1467, in __get_hook 
entities = rpc.user_data(entities) 
File "C:\Program Files (x86)\Google\google_appengine\google\appengine\api\datastore.py", line 597, in local_extra_hook 
raise datastore_errors.EntityNotFoundError() 
EntityNotFoundError 

我使用App Engine開發服務器1.6.5在Windows 7機器上。

回答

0

當您查看SDK管理控制檯時:您是否看到您的實體? 或者你是否清除每個SDK上的實體都以--clear標誌開始?

+0

感謝您的回覆voscausa,是的,我可以在管理控制檯中看到實體和用戶條目。我也嘗試了管理控制檯終端中的getUserFileTable代碼,並得到相同的結果。我不關閉測試之間的AppEngineLauncher,也得到我期望從GQLQuery得到的結果數量,只是blob_key.filename引用給出了EntityNotFoundError – brif

+0

我沒有看到錯誤,也許用戶對象發生了變化。你有沒有嘗試部署它,也許這是一個SDK問題。 – voscausa

+0

嗨voscausa,感謝檢查代碼是正確的。我發現什麼是錯的 - 我很傻!我使用的jquery演示代碼有一個函數,可以在設定的時間後刪除所有blob條目,以避免填滿blobstore。我認爲這是我如何使用錯誤的blobstore,並沒有正確檢查演示代碼(很快)。您對我的代碼的驗證幫助我意識到這是其他事情,所以我標記了您的答案正確。再次感謝。 – brif

相關問題