Da Play kein HttpServlet bassierendes System ist. Kommt man manchmal an seine Grenzen wenn mit der Google App Engine arbeit. Nach einer längeren Suche und einigen Posts in diversen Foren konnte ich eine Lösung finden.

Ein kleines Beispiel zeigt wie man Bilder hochladen kann und dann im Callback den BlobKey erhält.

Im view kann mittels



<form action="${controllers.GAEImageUploader.getUploadFormAction()}"
enctype="multipart/form-data" method="post">
    <input type="file" name="newblob">
    <input type="submit" value="upload">
</form>




Ein Formular erzeugt werden.

Den Controller findet ihr hier:





public class GAEImageUploader extends Controller {

    private static HttpServletResponse getHttpServletResponse() {
        return (HttpServletResponse)request.args.get(ServletWrapper.SERVLET_RES);
    }

    private static HttpServletRequest getHttpServletRequest() {
        return (HttpServletRequest)request.args.get(ServletWrapper.SERVLET_REQ);
    }

    public static String getUploadFormAction() {
        BlobstoreService blobService = BlobstoreServiceFactory.getBlobstoreService();

        // if needed add some variables here into the map.
        // Later you will get them back when callback is called
        Map<String, Object> paramMap = new HashMap<String, Object>();
        String callbackUrl = Router.reverse("GAEImageUploader.onuploaded", paramMap).url;
        return blobService.createUploadUrl(callbackUrl);
    }

    public static void serve(String blobKeyString) throws IOException
{
        BlobstoreService blobService = BlobstoreServiceFactory.getBlobstoreService();
        blobService.serve(new BlobKey(blobKeyString), getHttpServletResponse());
    }

    public static void onuploaded() throws IOException {
        Logger.info("onuploaded complete");

        BlobstoreService blobService = BlobstoreServiceFactory.getBlobstoreService();
        Map<String, BlobKey> blobs = blobService.getUploadedBlobs(getHttpServletRequest());

        Logger.info("uploaded blobs map size :" + blobs.size());
        Iterator<BlobKey> iterator = blobs.values().iterator();

        // Blob key exists so serve directly
        if (iterator.hasNext()) {
            BlobKey blobKey = iterator.next();
            serve(blobKey.getKeyString());
            return;
        } else {
            // Otherwise render default
            render();
        }
    }

}