Как загрузить и сохранить изображение с помощью Google App Engine (java)

Я ищу самый простой способ загрузить и сохранить изображение (файл) в GAE (Java). Погуглить часами без простого и понятного результата.

Нашел эту ссылку.

Но я до сих пор не знаю, как сохранить изображение и как его восстановить. Я ищу простой пример сервлета.

Ответ 1

Ссылка, которую вы предоставили "Как обрабатывать загрузки файлов в мое приложение?" объясняет, как вы можете загружать изображение.

Чтобы разместить изображения, вам необходимо использовать Служба хранилища данных для хранения и отображения изображения вместе с вашими другими данными.

Вот пример кода. Это подразумевается как эскиз, поскольку вы можете иметь свой собственный объект (например, бизнес, пользователь и т.д.) Для поля для изображения. Я не обращал внимания на всю обработку ошибок и восстановление, чтобы упростить код.

Объявление объекта с изображением. Вы можете представить себе другие поля, например. теги, местоположение и т.д.

@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; }
}

Затем, когда вы начинаете принимать изображения (обратите внимание на случаи, когда изображение с таким же именем уже было загружено в дополнение к типичным сбоям загрузки файлов). ServletFileUpload и IOUtils - это классы, которые являются частью библиотеки 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());
}

И наконец, когда вы хотите служить изображению с его именем:

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

Ответ 2

Используйте API blobstore:

API Blobstore позволяет вашему приложению обслуживать объекты данных, называемые блоками, которые намного больше размера, разрешенного для объектов в службе хранилища данных. Blobs полезны для работы с большими файлами, такими как видео или файлы изображений, а также для предоставления пользователям возможности загружать большие файлы данных. Блоки создаются путем загрузки файла через HTTP-запрос. Как правило, ваши приложения будут делать это, представив пользователю форму с полем загрузки файла. Когда форма отправляется, Blobstore создает blob из содержимого файла и возвращает непрозрачную ссылку на blob, называемую клавишей blob, которую позже можно использовать для обслуживания blob. Приложение может обслуживать полное значение blob в ответ на запрос пользователя или может считывать значение напрямую с помощью потокового файлоподобного интерфейса...

Ответ 3

Самый простой способ использования URL-адреса Google App Engine Blob Store (вы сохраняете время экземпляра)

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