69 votes

Comment télécharger et stocker une image avec Google App Engine (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, ni comment la récupérer ... Je recherche un exemple de servlet simple ...

96voto

notnoop Points 30218

Le lien de votre condition "Comment gérer les uploads de fichier pour mon application?" explique comment vous pouvez télécharger l'image.

Pour héberger les images, vous devez utiliser la banque de données du service de stocker et de servir de l'image avec vos autres données.

Voici un exemple de code. Il est conçu comme une esquisse, pour la façon dont vous pouvez avoir votre propre entité (j'.g. d'affaires, utilisateurs, etc) ont un champ d'une image. Je l'ai ignoré toute erreur de manipulation et de récupération pour simplifier le code.

La déclaration de l'entité avec l'image. Vous pouvez imaginer avoir d'autres domaines, comme par exemple les 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 (attention pour les cas où une image avec le même nom a déjà été téléchargé en plus du fichier type télécharger des échecs). ServletFileUpload et IOUtils sont des classes qui font partie de l'Apache Commons bibliothèque.

// 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 l'image 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());
}

10voto

Claude Vedovini Points 1624

5voto

Meilleure façon d'utiliser l'URL de service 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));
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X