您提供的
“How do I handle file uploads to my app?”链接解释了如何上传图像。
要托管图像,您需要使用Datastore service来存储和提供图像以及您的其他数据。
下面是一个示例代码。它的意思是一个草图,如何让你自己的实体(例如,业务,用户等)有一个图像的字段。我忽略了所有的错误处理和恢复,以简化代码。
使用图片声明您的实体。您可以想象有其他字段,例如标签,位置等
@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 results = (List)query.execute(name);
Blob image = results.iterator().next().getImage();
// serve the first image
res.setContentType("image/jpeg");
res.getOutputStream().write(image.getBytes());
}