Como fazer upload e armazenar uma imagem com o mecanismo do Google app (java)

Eu estou procurando a maneira mais simples de fazer upload e armazenar uma imagem (arquivo) para o GAE (java). Pesquisando por horas sem nenhum resultado simples e claro …: (

Encontrei este link .

Mas eu ainda não sei como armazenar uma imagem, e como recuperá-la … Estou procurando um exemplo simples de servlet …

O link que você forneceu “Como faço para lidar com uploads de arquivos para meu aplicativo?” explica como você pode carregar a imagem.

Para hospedar as imagens, você precisa usar o serviço Datastore para armazenar e veicular imagens junto com seus outros dados.

Aqui está um código de exemplo. Ele serve como um esboço, pois como você pode ter sua própria entidade (ig business, user, etc) tem um campo para uma imagem. Eu ignorei todo o tratamento e recuperação de erros para simplificar o código.

Declarando sua entidade com a imagem. Você pode imaginar ter outros campos, por exemplo, tags, localização, 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; } } 

Então, quando você começar a aceitar imagens (atente para os casos em que uma imagem com o mesmo nome já foi carregada, além das falhas típicas de upload de arquivo). ServletFileUpload e IOUtils são classs que fazem parte da biblioteca do 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()); } 

E finalmente quando você quiser servir uma imagem com o nome dela:

 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 results = (List)query.execute(name); Blob image = results.iterator().next().getImage(); // serve the first image res.setContentType("image/jpeg"); res.getOutputStream().write(image.getBytes()); } 

Use a API do blobstore :

A API do Blobstore permite que seu aplicativo forneça objects de dados, chamados blobs , que são muito maiores do que o tamanho permitido para os objects no serviço do Datastore. Os blobs são úteis para servir arquivos grandes, como arquivos de vídeo ou imagens, e para permitir que os usuários façam upload de arquivos de dados grandes. Os blobs são criados pelo upload de um arquivo por meio de uma solicitação HTTP. Normalmente, seus aplicativos farão isso apresentando um formulário com um campo de upload de arquivo ao usuário. Quando o formulário é enviado, o Blobstore cria um blob a partir do conteúdo do arquivo e retorna uma referência opaca ao blob, chamada de blob key , que você pode usar posteriormente para exibir o blob. O aplicativo pode servir o valor completo do blob em resposta a uma solicitação do usuário ou pode ler o valor diretamente usando uma interface semelhante a um arquivo de stream contínuo …

A maneira mais fácil de usar o URL de veiculação do Armazenamento de Blobs do Google App Engine (você economiza tempo de instância)

 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));