Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to upload and store an image with google app engine (java)

I am looking for the simplest way to upload and store an image (file) to the GAE (java). Googling for hours without any simple and clear result.

Found this link.

But I still don't know how to store an image, and how to retrieve it. I am looking for simple servlet example.

like image 333
OXMO456 Avatar asked Oct 03 '09 12:10

OXMO456


2 Answers

The link your provided "How do I handle file uploads to my app?" explains how you can upload the image.

To host the images, you need to use the Datastore service to store and serve image along with your other data.

Here is a sample code. It is meant as a sketch, for how you can have your own entity (i.g. business, user, etc) have a field for an image. I ignored all error handling and recovery to simplify the code.

Declaring your entity with the image. You can imagine having other fields, e.g. tags, location, etc

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

Then when you start accepting images (watch out for cases where an image with the same name has already been uploaded in addition to the typical file upload failures). ServletFileUpload and IOUtils are classes that are part of the Apache Commons library.

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

And finally when you want to serve an image given its name:

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()); } 
like image 116
notnoop Avatar answered Sep 20 '22 21:09

notnoop


Use the blobstore API:

The Blobstore API allows your application to serve data objects, called blobs, that are much larger than the size allowed for objects in the Datastore service. Blobs are useful for serving large files, such as video or image files, and for allowing users to upload large data files. Blobs are created by uploading a file through an HTTP request. Typically, your applications will do this by presenting a form with a file upload field to the user. When the form is submitted, the Blobstore creates a blob from the file's contents and returns an opaque reference to the blob, called a blob key, which you can later use to serve the blob. The application can serve the complete blob value in response to a user request, or it can read the value directly using a streaming file-like interface...

like image 31
Claude Vedovini Avatar answered Sep 20 '22 21:09

Claude Vedovini