2012-09-12 22 views
3

從App Engine Blobstore的文檔中,BlobStore中的每個條目都應在DataStore中有一個BlobInfo條目。那麼爲什麼我的blobInfo在下面的代碼中爲空?App Engine(Java)Blobstore:成功存儲Blob後無BlobInfo

注:

  • 如果我刪除的BlobInfo代碼,該servlet返回的資源,因爲它應該(但不包含文件名)
  • 爲了簡便起見,我刪除異常和參數處理

我會非常感謝您的幫助。

public class GetResourceServlet extends HttpServlet { 
    private BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService(); 
    private BlobInfoFactory infoFactory = new BlobInfoFactory(); 

    public void doGet ( HttpServletRequest request, HttpServletResponse response) 
      throws ServletException, IOException { 

     String blobKeyStr = request.getParameter("blob-key"); 
     BlobKey blobKey = new BlobKey(blobKeyStr); 

     BlobInfo info = infoFactory.loadBlobInfo(blobKey); // returns null !? 
     String fname = info.getFilename(); 
     response.addHeader("content-disposition", "attachment; filename=" + fname); 

     blobstoreService.serve(blobKey, response); 
    } 
+0

您是否可以在管理控制檯中看到您想要在BlobViewer中訪問的blob? –

+0

Blob存儲在Blobstore中。實際上,blobstoreService.serve()應該返回blob。問題是我無法檢索應存儲在數據存儲區(而非Blobstore)中的blob元數據。如果我查看DataViewer,則看不到任何類型爲'BlobInfo'的條目,但我不知道是否應該... –

+1

元數據存儲在__BlobInfo__下。查詢「SELECT * FROM __BlobInfo__」 –

回答

1

最後,我發現了這個問題。密鑰字符串(blobKeyStr)在末尾包含換行符。令人討厭的是,你在記錄中沒有注意到它。添加blobKeyStr = blobKeyStr.trim()解決了問題

+0

因此,用你的代碼,你可以得到文件的內容?因爲我需要它在Google雲端存儲上傳 – Aerox

+0

是的,blobStoreService.serve指示Google App Engine獲取內容並將其發送給客戶端。在這種情況下,客戶端應該將這些內容作爲文件下載。這就是爲什麼我需要BlobInfo來獲取文件名。 –

+0

好的謝謝:-)所以這是DownloadSide。上傳過程中遇到問題嗎?因爲當我嘗試上傳大於32MB的文件時我收到了錯誤,而我不知道如何解決此問題。你的代碼是否適用於它?謝謝 – Aerox

0

執行下列操作第一:

  • 確保BLOB存在於本地數據存儲訪問的 'http://本地主機:8080/_ah /管理員',然後數據存儲觀衆。你應該看到新的條目Hcreated爲你的斑點。記下關鍵值。

  • 請確保您的請求中使用了正確的BLOB鍵。

您提到過,爲了簡潔起見,您已從上面刪除了異常處理代碼。你有沒有得到任何例外,而檢索假定不存在的blob?

+0

我將在info.getFilename()上得到一個異常,因爲info == null。如果我刪除這一行,那麼servlet將按照它應該返回的資源(但是,客戶端不會得到文件名或文件類型。)所以Blob在那裏,blobkey很好。爲什麼數據存儲中沒有blobinfo數據?我認爲它是在blob存儲時自動創建和存儲的,對嗎? –

相關問題