如何上传和存储与谷歌应用程序引擎的图像(Java)
我正在寻找上传和存储图像(文件)到GAE(java)最简单的方法。 谷歌search几个小时没有任何简单和明确的结果… 🙁
find这个链接 。
但我仍然不知道如何存储图像,以及如何检索它…我正在寻找简单的servlet exmample …
您提供的“如何处理file upload到我的应用程序?”链接 说明如何上传图片。
要托pipe这些图像,您需要使用数据存储服务来存储和提供图像以及其他数据。
这是一个示例代码。 它的意思是作为一个草图,你如何拥有自己的实体(ig business,user等)有一个图像的领域。 我忽略了所有error handling和恢复来简化代码。
用图像声明你的实体。 你可以想象有其他的领域,如标签,位置等
@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; } }
然后,当您开始接受图像时(请注意,除了典型的file upload失败之外,已经上传了同名图像的情况)。 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()); }
使用blobstore API :
Blobstore API允许您的应用程序为数据对象(称为blob)提供比Datastore服务中的对象所允许的大得多的数据对象。 Blob对于服务大文件(如video或图像文件)以及允许用户上传大型数据文件非常有用。 Blob是通过HTTP请求上传文件而创build的。 通常,您的应用程序将通过向用户呈现带有file upload字段的表单来执行此操作。 当表单被提交时,Blobstore从文件内容创build一个blob,并返回一个不透明的引用,这个引用被称为blob key ,你可以稍后使用它来提供blob。 应用程序可以响应用户请求提供完整的blob值,也可以使用stream式文件类接口直接读取值…
使用Google App Engine Blob Store服务URL的最简单方法(您节省实例时间)
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));