我正在寻找最简单的方法来将图像(文件)上传和存储到GAE(java)。搜寻数小时,没有任何简单明确的结果。
找到了此链接。
但是我仍然不知道如何存储图像以及如何检索图像。我在寻找简单的servlet示例。
Answers:
您提供的链接“我如何处理文件上传到我的应用程序?” 解释了如何上传图像。
要托管图像,您需要使用数据存储服务来存储和提供图像以及其他数据。
这是示例代码。它是作为草图,用于显示如何使自己的实体(例如企业,用户等)具有图像字段。为了简化代码,我忽略了所有错误处理和恢复。
用图像声明您的实体。您可以想象还有其他字段,例如标签,位置等
@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的共享库的一部分课程。
// 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使您的应用程序可以提供称为blob的数据对象,该对象比Datastore服务中对象所允许的大小大得多。Blob对于提供大文件(例如视频或图像文件)以及允许用户上传大数据文件很有用。通过通过HTTP请求上传文件来创建Blob。通常,您的应用程序将通过向用户显示一个带有文件上载字段的表单来执行此操作。提交表单后,Blobstore从文件内容创建一个Blob,并返回对该Blob的不透明引用,称为Blob键,您以后可以使用该Blob键来提供该Blob。该应用程序可以响应用户请求提供完整的Blob值,也可以使用类似于流文件的界面直接读取该值。
使用Google App Engine Blob存储服务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));