Skip to content
This repository has been archived by the owner on May 25, 2023. It is now read-only.

Google App Engine Java

blueimp edited this page Jun 24, 2011 · 24 revisions

Code samples to integrate the plugin with Google App Engine Java.
Contributed by yamsellem.

$(function() {
	$.getJSON('/rest/file/url', function (response) {
		$('#fileupload form').prop('action', response.url);
		$('#fileupload').fileupload({
			add: function (e, data) {
			    var that = this;
			    data.url = response.url;
			    $.blueimpUI.fileupload.prototype.options.add.call(that, e, data);
			}
		});
	});
});
@Path("/file")
public class FileResource {

    private final BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService();
    private final BlobInfoFactory blobInfoFactory = new BlobInfoFactory();
    
    /* step 1. get a unique url */
    
    @GET
    @Path("/url")
    public Response getCallbackUrl() {
        String url = blobstoreService.createUploadUrl("/rest/file");
        return Response.ok(new FileUrl(url)).build();
    }
    
    /* step 2. post a file */
    
    @POST
    @Consumes(MediaType.MULTIPART_FORM_DATA)
    public void post(@Context HttpServletRequest req, @Context HttpServletResponse res) throws IOException, URISyntaxException {
        Map<String, BlobKey> blobs = blobstoreService.getUploadedBlobs(req);
        BlobKey blobKey = blobs.get("files[]");
        res.sendRedirect("/rest/file/" + blobKey.getKeyString() + "/meta");
    }
    
    /* step 3. redirected to the meta info */
    
    @GET
    @Path("/{key}/meta")
    public Response redirect(@PathParam("key") String key) throws IOException {
        BlobKey blobKey = new BlobKey(key);
        BlobInfo info = blobInfoFactory.loadBlobInfo(blobKey);

        String name = info.getFilename();
        long size = info.getSize();
        String url = "/rest/file/" + key; 
        FileMeta meta = new FileMeta(name, size, url);

        List<FileMeta> metas = Lists.newArrayList(meta);
        GenericEntity<List<FileMeta>> entity = new GenericEntity<List<FileMeta>>(metas) {};
        return Response.ok(entity).build();
    }

    /* step 4. download the file */
    
    @GET
    @Path("/{key}")
    public Response serve(@PathParam("key") String key, @Context HttpServletResponse response) throws IOException {
        BlobKey blobKey = new BlobKey(key);
        final BlobInfo blobInfo = blobInfoFactory.loadBlobInfo(blobKey);
        response.setHeader("Content-Disposition", "attachment; filename=" + blobInfo.getFilename());
        BlobstoreServiceFactory.getBlobstoreService().serve(blobKey, response);
        return Response.ok().build();
    }
    
    /* step 5. delete the file */
    
    @DELETE
    @Path("/{key}")
    public Response delete(@PathParam("key") String key) {
        Status status;
        try {
            blobstoreService.delete(new BlobKey(key));
            status = Status.OK;
        } catch (BlobstoreFailureException bfe) {
            status = Status.NOT_FOUND;
        }
        return Response.status(status).build();
    }
}
  • the representations
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class FileUrl {
    String url;

    public FileUrl(String url) {
        this.url = url;
    }
}

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class FileMeta {
    String name;
    long size;
    String url;
    String delete_url;  
    String delete_type;  

    public FileMeta(String filename, long size, String url) {
        this.name = filename;
        this.size = size;
        this.url = url;
        this.delete_url = url;
        this.delete_type = "DELETE";
    }

    public FileMeta() {
    }
}
  • web.xml
<web-app>
    <servlet>
        <servlet-name>jersey</servlet-name>
        <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>com.sun.jersey.config.property.packages</param-name>
            <param-value>com.xebia.jquery.resource</param-value>
        </init-param>
        <init-param>
            <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
            <param-value>true</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>jersey</servlet-name>
        <url-pattern>/rest/*</url-pattern>
    </servlet-mapping>
</web-app>
  • pom.xml
<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-server</artifactId>
    <version>1.7</version>
</dependency>
<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-json</artifactId>
    <version>1.7</version>
</dependency>
<dependency>
    <groupId>com.sun.jersey.contribs</groupId>
    <artifactId>jersey-multipart</artifactId>
    <version>1.7</version>
</dependency>
Clone this wiki locally