Pergunta

Eu estou procurando a maneira mais simples de carregar e armazenar uma imagem (arquivo) para o GAE (java). Pesquisando por horas sem qualquer simples e clara resultado ...: (

este link .

Mas eu ainda não sei como armazenar uma imagem, e como recuperá-lo ... Estou à procura de simples servlet exmample ...

Foi útil?

Solução

O link para o seu fornecidos "Como posso lidar com o upload de arquivos para meu aplicativo ? " explica como você pode fazer o upload da imagem.

Para hospedar as imagens, você precisa usar o href="http://code.google.com/appengine/docs/java/gettingstarted/usingdatastore.html" rel="noreferrer"> serviço para armazenar e servir imagem junto com seus outros dados.

Aqui está um código de exemplo. Ele foi criado como um esboço, de como você pode ter a sua própria entidade (business i.g., usuário, etc) tem um campo para uma imagem. Ignorei todos erro de manipulação e recuperação para simplificar o código.

Declarando sua entidade com a imagem. Você pode imaginar ter outros campos, por exemplo, etiquetas, 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 enviados para além das típicas falhas de carregamento de arquivo). ServletFileUpload e IOUtils são classes que fazem parte da biblioteca 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ê quer servir uma imagem dado o seu nome:

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

Outras dicas

Use a blobstore API :

O Blobstore API permite que seu aplicativo para servir objetos de dados, chamado blobs , que são muito maiores do que o tamanho permitido para objetos no serviço de armazenamento de dados. Blobs são úteis para servir arquivos grandes, como arquivos de vídeo ou imagem, e por permitir que usuários façam upload de grandes arquivos de dados. Blobs são criados por upload de um arquivo através de uma solicitação HTTP. Normalmente, as aplicações vão fazer isso através da apresentação de um formulário com um campo de upload de arquivos para o usuário. Quando o formulário é enviado, o Blobstore cria uma bolha de conteúdo do arquivo e retorna uma referência opaca para o blob, chamado chave blob , que você pode usar mais tarde para servir o blob. A aplicação pode servir o valor completo blob em resposta a um pedido do utilizador, ou pode ler o valor diretamente usando um streaming de arquivo-como interface ...

A maneira mais fácil de usar o Google App Engine Blob loja servindo URL (Você economiza tempo 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));
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top