2013-03-29 58 views
0

您好我試圖做一個servlet,允許管理員上傳圖像和任何谷歌用戶查看這些圖片,工作關可得的節目至今IM在https://developers.google.com/appengine/docs/java/blobstore/overview谷歌應用程序引擎使用的blobKey

當我上傳一個圖像,它使用一個非常長的blobKey馬上服務它?並將其本身的副本存儲在local_db.bin中

我無法找到的是如果有任何方法來縮短blobkeys的使用?例如,我想有一個畫廊,顯示所有已上傳的用戶圖像,但到目前爲止,我可以從數據庫中獲取圖像的唯一方法是通過調用類似於此的

res.sendRedirect(「服務?blob-key =「+ blobKey.getKeyString())

但這隻適用於一個圖像,我需要硬編碼每個新的blobKey,以便在單獨的頁面上顯示,也意味着當用戶上傳一個新的圖像,我將不得不編輯代碼併爲新圖像添加一個新的鏈接?

基本上我想知道的是,如果無論如何要輕鬆定義存儲在local_db.bin中的每個blob。

任何幫助將不勝感激請不要猶豫,要求更多的細節。

感謝

+0

GAE可以使用圖像服務api來提供來自GAE的圖像。在這篇文章中看到我的解決方案http://stackoverflow.com/questions/15306790/how-can-i-upload-an-thumbnail-image-blob-at-the-same-time-as-an-entity-into- a/15309278#15309278 –

+0

@ user2216137我的回答有幫助嗎? – xybrek

回答

0

,我認爲你是在一個略顯尷尬的方式接近你的問題。

它不是Blobstore的問題,它給你這個blob密鑰。你可以做的是:

  • 創建一個上傳的servlet捕捉文件上傳
  • 獲取字節,並將其存儲使用AppEngine上文件API

下面就讓我來告訴你(從工作的代碼塊我的項目):

@POST 
@Consumes("multipart/form-data") 
@Path("/databases/{dbName}/collections/{collName}/binary") 
@Override 
public Response createBinaryDocument(@PathParam("dbName") String dbName, 
     @PathParam("collName") String collName, 
     @Context HttpServletRequest request, @Context HttpHeaders headers, 
     @Context UriInfo uriInfo, @Context SecurityContext securityContext) { 

    try { 
     ServletFileUpload upload = new ServletFileUpload(); 
     FileItemIterator fileIterator = upload.getItemIterator(request); 
     while (fileIterator.hasNext()) { 
      FileItemStream item = fileIterator.next(); 
      if ("file".equals(item.getFieldName())){ 
       byte[] content = IOUtils.toByteArray(item.openStream()); 

       logger.log(Level.INFO, "Binary file size: " + content.length); 
       logger.log(Level.INFO, "Mime-type: " + item.getContentType()); 

       String mimeType = item.getContentType(); 

       FileService fileService = FileServiceFactory.getFileService(); 
       AppEngineFile file = fileService.createNewBlobFile(mimeType); 
       String path = file.getFullPath(); 
       file = new AppEngineFile(path); 
       boolean lock = true; 
       FileWriteChannel writeChannel = fileService.openWriteChannel(file, lock); 
       writeChannel.write(ByteBuffer.wrap(content)); // This time we write to the channel directly 
       writeChannel.closeFinally(); 
       BlobKey blobKey = fileService.getBlobKey(file); 
      } else if ("name".equals(item.getFieldName())){ 
       String name=IOUtils.toString(item.openStream()); 
       // TODO Add implementation 
      } 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return null; 
} 

正如你可以看到Blob存儲服務是「象」只是其中的一部分,你必須讓自己的API或東西,將讓這些圖片或任何二進制數據到Blobstore,包括將其文件名保存到數據存儲區。

你要做的另一件事情是你的API或接口把它弄出來從Blob存儲到客戶端:

  • @GET資源與查詢參數一樣?filename=whatever
  • 然後你會從取數據存儲與此文件名相關聯的blobkey

這只是一個簡化示例,您必須確保保存Filename和Blobkey,即在正確的容器和用戶中,如果您需要d。

您可以直接使用Blobstore API和Image API,但如果您需要進一步控制,則必須設計自己的API。它並不難,Apache Jersey和JBoss Resteasy與GAE完美搭配。