web-dev-qa-db-fra.com

Comment télécharger et stocker une image avec le moteur d'application Google (Java)

Je cherche le moyen le plus simple de télécharger et de stocker une image (fichier) sur le GAE (Java). Googler pendant des heures sans résultat simple et clair ...: (

Trouvé ce lien .

Mais je ne sais toujours pas comment stocker une image et comment la récupérer ... Je recherche par exemple un servlet simple ...

69
OXMO456

Le lien que vous avez fourni "Comment gérer les téléchargements de fichiers vers mon application?" explique comment vous pouvez télécharger l'image.

Pour héberger les images, vous devez utiliser le service Datastore pour stocker et diffuser l'image avec vos autres données.

Voici un exemple de code. Il s'agit d'une esquisse expliquant comment vous pouvez avoir votre propre entité (entreprise, utilisateur, etc.) avec un champ pour une image. J'ai ignoré toute la gestion des erreurs et la récupération pour simplifier le code.

Déclarer votre entité avec l'image. Vous pouvez imaginer avoir d'autres champs, par exemple balises, emplacement, etc.

@Entity
public class MyImage {
    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    private Long id;

    @Persistent
    private String name;

    @Persistent
    Blob image;

    public MyImage() { }
    public MyImage(String name, Blob image) {
        this.name = name; 
        this.image = image;
    }

    // JPA getters and setters and empty contructor
    // ...
    public Blob getImage()              { return image; }
    public void setImage(Blob image)    { this.image = image; }
}

Ensuite, lorsque vous commencez à accepter des images (faites attention aux cas où une image du même nom a déjà été téléchargée en plus des échecs de téléchargement de fichiers typiques). ServletFileUpload et IOUtils sont des classes qui font partie de la bibliothèque Apache Commons.

// Your upload handle would look like
public void doPost(HttpServletRequest req, HttpServletResponse res) {
    // Get the image representation
    ServletFileUpload upload = new ServletFileUpload();
    FileItemIterator iter = upload.getItemIterator(req);
    FileItemStream imageItem = iter.next();
    InputStream imgStream = imageItem.openStream();

    // construct our entity objects
    Blob imageBlob = new Blob(IOUtils.toByteArray(imgStream));
    MyImage myImage = new MyImage(imageItem.getName(), imageBlob);

    // persist image
    PersistenceManager pm = PMF.get().getPersistenceManager();
    pm.makePersistent(myImage);
    pm.close();

    // respond to query
    res.setContentType("text/plain");
    res.getOutputStream().write("OK!".getBytes());
}

Et enfin quand vous voulez servir une image compte tenu de son nom:

Blob imageFor(String name, HttpServletResponse res) {
    // find desired image
    PersistenceManager pm = PMF.get().getPersistenceManager();
    Query query = pm.newQuery("select from MyImage " +
        "where name = nameParam " +
        "parameters String nameParam");
    List<MyImage> results = (List<MyImage>)query.execute(name);
    Blob image = results.iterator().next().getImage();

    // serve the first image
    res.setContentType("image/jpeg");
    res.getOutputStream().write(image.getBytes());
}
96
notnoop

Utilisez API blobstore :

L'API Blobstore permet à votre application de servir des objets de données, appelés blobs , qui sont beaucoup plus grands que la taille autorisée pour les objets dans le service Datastore. Les objets blob sont utiles pour servir des fichiers volumineux, tels que des fichiers vidéo ou image, et pour permettre aux utilisateurs de télécharger des fichiers de données volumineux. Les blobs sont créés en téléchargeant un fichier via une requête HTTP. En règle générale, vos applications le feront en présentant à l'utilisateur un formulaire avec un champ de téléchargement de fichier. Lorsque le formulaire est soumis, le Blobstore crée un blob à partir du contenu du fichier et renvoie une référence opaque au blob, appelée clé blob , que vous pouvez utiliser plus tard pour servir le blob. L'application peut servir la valeur blob complète en réponse à une demande de l'utilisateur, ou elle peut lire la valeur directement en utilisant une interface de type fichier en streaming ...

10
Claude Vedovini

Manière la plus simple d'utiliser l'URL de diffusion du Blob Store de Google App Engine (vous économisez du temps d'instance)

import com.google.appengine.api.files.FileService;
import com.google.appengine.api.files.AppEngineFile;
import com.google.appengine.api.files.FileWriteChannel;
import com.google.appengine.api.blobstore.BlobKey;
import com.google.appengine.api.images.ImagesServiceFactory;
import com.google.appengine.api.images.ServingUrlOptions;
...


// your data in byte[] format
byte[] data = image.getData();
/**
 *  MIME Type for
 *  JPG use "image/jpeg" for PNG use "image/png"
 *  PDF use "application/pdf"
 *  see more: https://en.wikipedia.org/wiki/Internet_media_type
 */
String mimeType = "image/jpeg";

// save data to Google App Engine Blobstore 
FileService fileService = FileServiceFactory.getFileService();
AppEngineFile file = fileService.createNewBlobFile(mimeType); 
FileWriteChannel writeChannel = fileService.openWriteChannel(file, true);
writeChannel.write(Java.nio.ByteBuffer.wrap(data));
writeChannel.closeFinally();

// your blobKey to your data in Google App Engine BlobStore
BlobKey blobKey = fileService.getBlobKey(file);

// THANKS TO BLOBKEY YOU CAN GET FOR EXAMPLE SERVING URL FOR IMAGES

// Get the image serving URL (in https:// format)
String imageUrl =
  ImagesServiceFactory.getImagesService().getServingUrl(
    ServingUrlOptions.Builder.withBlobKey(blobKey
          ).secureUrl(true));
5
Dodo