Если они становятся меньшими, и у Вас нет ничего для получения от использования предложений функций PNG (который является прозрачностью альфа-канала и больше чем 256 цветами), тогда, я не вижу оснований, почему необходимо использовать PNG.
Ссылка, предоставленная вами «Как мне обрабатывать загрузку файлов в мое приложение?» объясняет, как вы можете загрузить изображение.
Чтобы разместить изображения, вам необходимо использовать службу хранилища данных для хранения и обслуживания изображения вместе с другими вашими данными.
Вот пример кода. Он задуман как набросок того, как у вашего собственного объекта (например, компании, пользователя и т. Д.) Есть поле для изображения. Я проигнорировал всю обработку ошибок и восстановление, чтобы упростить код.
Объявление вашей сущности с изображением. Вы можете себе представить, что у вас есть другие поля, например, теги, местоположение и т. Д.
@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());
}
Используйте API хранилища больших двоичных объектов :
API хранилища больших двоичных объектов позволяет вашему приложению обслуживать объекты данных, называемые блобами , которые намного больше, чем размер, разрешенный для объектов в службе хранилища данных. BLOB-объекты полезны для обслуживания больших файлов, таких как файлы видео или изображений, а также для предоставления пользователям возможности загружать большие файлы данных. Большие двоичные объекты создаются путем загрузки файла через HTTP-запрос. Обычно ваши приложения делают это, представляя пользователю форму с полем для загрузки файла. Когда форма отправляется, Blobstore создает большой двоичный объект из содержимого файла и возвращает непрозрачную ссылку на большой двоичный объект, называемую ключом большого двоичного объекта , который впоследствии можно использовать для обслуживания большого двоичного объекта. Приложение может обслуживать полное значение большого двоичного объекта в ответ на запрос пользователя или может считывать значение напрямую, используя потоковый файловый интерфейс ...