2009-10-03 8 views

Répondre

96

le lien fournies par votre "How do I handle file uploads to my app?" explique comment vous pouvez télécharger l'image.

pour héberger les images, vous devez utiliser le Datastore service pour stocker et servir l'image ainsi que d'autres données de votre

Voici un exemple de code. Il s'agit d'une esquisse, pour savoir comment vous pouvez avoir votre propre entité (par exemple, entreprise, utilisateur, etc.) avoir un champ pour une image. J'ai ignoré toutes les erreurs de traitement et de récupération pour simplifier le code.

Déclaration de votre entité avec l'image. Vous pouvez imaginer avoir d'autres champs, par ex. 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; } 
} 

Puis, quand vous commencez à accepter des images (attention pour les cas où une image avec le 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 donnée 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()); 
} 
+0

merci beaucoup pour cette réponse claire et compréhensible !!! :) – OXMO456

+0

merveilleux, merci. pouvez-vous me dire pourquoi tableau byte ne donnera pas de sortie correcte, bien que son stockage, etc, j'avais posé cette question il y a un certain temps http://stackoverflow.com/questions/2018597/cannot-fetch-image-data-in- gwt-google-datastore-image-is-strected-out – dhaval

+0

excellente réponse! –

10

Utilisez le blobstore API:

L'API Blobstore permet à votre application pour servir les objets de données, appelé blobs, qui sont beaucoup plus grands que la taille autorisée pour les objets dans le service Datastore. Les blobs sont utiles pour le traitement de gros fichiers, tels que des fichiers vidéo ou d'image, et pour permettre aux utilisateurs de télécharger de gros fichiers de données. 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 un formulaire avec un champ de téléchargement de fichier à l'utilisateur. 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 blob key, que vous pouvez ensuite utiliser pour servir le blob. L'application peut servir la valeur blob complète en réponse à une demande de l'utilisateur, ou il peut lire directement la valeur à l'aide d'une interface de type fichier en streaming ...

+3

cela nécessite d'activer la facturation dans votre application. –

+1

@ luca-matteis Voici un travail pour cela http://groups.google.com/group/gaelyk/browse_thread/thread/7982f33b5093a162 – jontro

+0

@LucaMatteis Salut, c'est vrai? Si j'utilise un quota par défaut gratuit, dois-je toujours activer la facturation? – GMsoF

5

manière la plus simple d'utiliser l'URL Google App Engine Blob magasin au service (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)); 
+1

AVERTISSEMENT! Le code ci-dessus est obsolète. –

+1

toute alternative comme ci-dessus le code est obsolète? –

+0

Je crois que la nouvelle façon de servir les images serait avec le stockage en nuage comme ceci: https://cloud.google.com/python/getting-started/using-cloud-storage –

Questions connexes