2014-08-27 6 views
0

Je développe un projet Google App Engine. En fait, je veux enregistrer les images dans le blobstore, après cela, je récupère la clé blob et l'URL de service, et je les stocke dans une entité Demand dans Datastore.Insérer une image dans Blobstore?

Mon fichier jsp est:

<%@ 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> 

Mon servlet qui gère la demande:

 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("/");} 

Le problème est quand je télécharge une image, il fonctionne très bien, le blob et l'image se trouve dans l'entité BlobInfo mais aucun résultat ajouté dans mon entité Demand (aucune nouvelle insertion dans cette entité). J'ai essayé d'imprimer la clé blob de l'image insérée:

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

Mais, aucun résultat. Merci pour votre aide.

Répondre

0

Le problème est résolu, il est dû à la successpath qui avait une valeur "/" dans le fichier jsp:

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

Le successPath est URL relative qui sera invoquée après que l'utilisateur a transféré un blob avec succès. Ainsi, lorsque blob est téléchargé avec succès, le jsp retourne au répertoire principal et n'exécute pas le code de la méthode doPost(). Pour cette raison, j'ai résolu le problème en copiant le code de la méthode doPost sur un autre servlet nommé par exemple NewDemandHandler et éditant le successpath au chemin relatif de cette servlet:

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

blobs est un Map. Voulez-vous la clé pour les blobs de la carte ou une liste de BlobKeys?

Pour obtenir une clé de la carte que vous pourriez faire.

blob.keySet() toArray() [0]

Pour obtenir une liste des BlobKeys que vous pourriez faire:

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

0

Vous sauvegardez les données BLOB sur blobs, et non sur blobKeys.

Imho vous devriez faire ceci:

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

J'ai essayé ce que vous avez dit mais malheureusement pas de résultat aussi. – GenIce