簡體   English   中英

使用blobstore api從雲存儲中檢索文件的Google App引擎Java錯誤

[英]google app engine java error using blobstore api to retrieve file from cloud storage

使用雲存儲客戶端API時,我開始遇到30MB文件大小限制。 經過研究,我發現GAE文檔建議我使用BlobStore API。

我創建了一個初始測試以上傳到我的雲服務中的存儲桶。 我注意到的一件事是文件名丟失了,而是使用了一個密鑰。 沒關系,我現在堅持Blob鍵和我要存儲的文件元數據之間的映射。

然后,我嘗試使用blobstoreService.createGsBlobKey()方法下載文件。 我要傳遞以下內容:“ / gs /” + bucketName +“ /” + fBlob.getBlobKey())其中fBlob是我的映射對象,其中包含文件信息和Blob鍵。

**編輯**我也嘗試使用文件的實際名稱而不是Blob鍵(我不太確定文檔要求什么),但是結果是相同的。

方法getBlobKey()就是這樣做的。 它返回我從BlobKey.getKeyString()方法檢索到的字符串。

一切似乎都很好,直到我訪問傳遞參數的servlet來檢索文件。 我所有的日志轉儲看起來都很不錯。 使事情更令人沮喪的是,日志中沒有任何錯誤。 唯一有問題的指示是通用網頁,該網頁顯示表明發生了500個錯誤,如果我繼續遇到此錯誤,則會在支持論壇中發布消息。

所以我在這里:)

任何幫助將不勝感激。 我將提供更多信息(即堆棧跟蹤),但正如我所提到的,沒有任何信息。 這是servlet的摘要:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws     ServletException, IOException {
    String iopsKey = request.getParameter("iopsId");
    String itemId = request.getParameter("itemId");
    String digitalId = request.getParameter("resourceId");

    Logger.getAnonymousLogger().info("Site Id: " + iopsKey);
    Logger.getAnonymousLogger().info("Item Id: " + itemId);
    Logger.getAnonymousLogger().info("Digital Good Id: " + digitalId);

    final DigitalResource resource = delegate.getDigitalResource(iopsKey, itemId, digitalId);
    Logger.getAnonymousLogger().info("Contents of Digital Resource: " + resource);

    FileBlobMap fBlob = delegate.findBLOBByFilename(resource.getInternalName());
    Logger.getAnonymousLogger().info("Contents of FileBlogMap: " + fBlob);

    BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService();
    BlobKey blobKey = blobstoreService.createGsBlobKey("/gs/vendor-imports/" + fBlob.getBlobKey());

    blobstoreService.serve(blobKey, response);
}

編輯#2 **經過一番摸索后,我意識到blobstore API生成的鍵/名稱似乎與雲存儲中實際存儲的不相關。

使用blobstore api時,我只知道2個對映射回存儲文件有用的字段:blob鍵對象的鍵字符串和文件的實際名稱。 但是,在雲存儲中創建的名稱/密鑰值是另一個密鑰字符串,似乎與任何AFAIK都不匹配。

現在,如果我從雲存儲中復制密鑰/名稱並將其硬編碼到通過DataStore Viewer存儲文件名/ blobkey映射的對象,則一切正常! 因此,似乎在雲存儲中的引用與我在回叫處理程序中獲得的內容之間存在脫節。

已解決**我正在使用的FileInfo對象中還有一個我沒有注意到的附加方法。 此方法稱為getGsObjectName(),它返回一個完全映射的字符串,該字符串包含“ / gs /”前綴以及我在雲存儲中看到的令牌字符串。 這對我來說不是立即顯而易見的,因此希望這篇文章可以節省其他人的時間。

我認為您可能在創建blobKey時遇到問題。 您的fBlob.getBlobKey()已返回blobKey,但隨后嘗試將其放入另一個blobKey。 您是否嘗試過僅將密鑰傳遞給blobstoreService.serve方法:

blobstoreService.serve(fBlob.getBlobKey(), response);

當服務器發生錯誤時,您看到的通用頁面也是AppEngine提供的錯誤頁面。 您應該檢查控制台是否有任何異常。 如果您正在生產環境中運行,則可以在AppEngine控制台中查看日志以查看錯誤的詳細信息。

已解決**我正在使用的FileInfo對象中還有一個我沒有注意到的附加方法。 此方法稱為getGsObjectName(),它返回一個完全映射的字符串,該字符串包含“ / gs /”前綴以及我在雲存儲中看到的令牌字符串。 這對我來說不是立即顯而易見的,因此希望這篇文章可以節省其他人的時間。

很抱歉,如果我的格式已關閉,並且我在多個地方都擁有“解決方案”,那么對不起。 這是我第一次發布,因此我有點領先。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM