2014-08-27 137 views
0

我正在開發一個Google App Engine項目。事實上,我想將圖像保存在blobstore中,之後,我恢復blob密鑰和服務url,並將它們存儲在Datastore中的Demand實體中。在Blobstore中插入圖像?

我的JSP文件是:

<%@ page contentType="text/html;charset=UTF-8" language="java"%> 
    <%@ page import="com.google.appengine.api.blobstore.*"%> 
    <%@ page import="com.Upload"%> 
    <% 
    BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService(); 
    %> 
    <!DOCTYPE html> 
    <html> 
    <head> 
    <meta charset="utf-8" /> 
    <meta name="viewport" content="width=device-width, initial-scale=1.0"> 
    <link href="css/bootstrap.min.css" rel="stylesheet" media="screen"> 
    <link href="css/style.css" rel="stylesheet" media="screen"> 
    </head> 
    <body> 
    <div class="container-narrow"> 
    <div class="masthead"> 
    <ul class="nav nav-pills pull-right"> 
    <li class="active"><a href="/">Accueil</a></li> 
    <li><a href="#upload">Upload</a></li> 
    </ul> 
    <h3 class="muted">Cloud Uploader</h3> 
    </div> 
    <hr /> 

    <form 
    action="<%= blobstoreService.createUploadUrl("/") %>" 
    method="post" enctype="multipart/form-data"> 
    <p> 
    <label>Fichier à envoyer : <input type="file" name="uploadedFile" /></label> 
    </p> 
    <div class="form-actions"> 
    <input type="submit" class="btn" /> 
    </div> 
    </form> 
    </div> 
    <script src="http://code.jquery.com/jquery.js"></script> 
    <script src="js/bootstrap.min.js"></script> 
    </body> 
    </html> 

我的servlet其處理請求:

 public void doGet(HttpServletRequest req, HttpServletResponse resp) 
    throws IOException, ServletException { 
    this.getServletContext().getRequestDispatcher("/UploadForm.jsp").forward(req, resp);} 


    public void doGet(HttpServletRequest req, HttpServletResponse resp) 
    throws IOException, ServletException { 
    BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService(); 
    ImagesService imagesService = ImagesServiceFactory.getImagesService(); 

    Map<String, List<BlobKey>> blobs = blobstoreService.getUploads(req); 

    System.out.println(blobKeys.get(0).toString());//No result 

    DataManager dat=new DataManager(); // this class contains DemandCreate method 

    String personPhotoServingUrl=   imagesService.getServingUrl(ServingUrlOptions.Builder.withBlobKey(blobKeys.get(0)));      
    String personPhotoBlobKey=blobKeys.get(0).toString(); 

    dat.DemandCreate("id3", "", "", "", "", 1, "", "", 3031, "", "", personPhotoBlobKey, personPhotoServingUrl);// this method enables user to store data in Datasotre using Objectify.. 

    resp.sendRedirect("/");} 

問題是,當我上傳的圖像,它工作正常,斑點,圖像被發現在BlobInfo實體中,但沒有結果添加到我的Demand實體中(此實體中沒有新的插入)。 我試圖打印插入圖像的blob鍵:

System.out.println(blobKeys.get(0).toString());//No result 

但沒有結果。 感謝您的幫助。

回答

0

問題是解決了,這是由於其曾在JSP文件中的值 「/」 的successpath:

<form 
action="<%= blobstoreService.createUploadUrl("/") %>" 
method="post" enctype="multipart/form-data"> 

的successPath是將在用戶成功上傳blob後調用的相對URL。 因此,當成功上傳blob時,jsp將返回到主體目錄,並且不會執行doPost()方法的代碼。因此,我通過將doPost方法的代碼複製到其他servlet來解決此問題命名爲例如NewDemandHandler並編輯成功路徑到這個servlet的相對路徑:

<form 
action="<%= blobstoreService.createUploadUrl("/NewDemandHandler") %>" 
method="post" enctype="multipart/form-data"> 
0

blob是一個地圖。你想要地圖blob或BlobKeys列表的關鍵嗎?

爲了得到一鍵地圖你可以做:)

blob.keySet()指定者([0]

要獲得BlobKeys的列表,你可以這樣做:

BLOB .get(blob.keySet()。toArray()[0])。get(0).toString()

0

將BLOB數據保存到blobs而不是blobKeys

恕我直言,你應該這樣做:

System.out.println(blobs.get("uploadedFile").toString()); 
+0

我試過你說的,但不幸的是沒有結果。 – GenIce 2014-08-27 20:53:03