diff --git a/appengine/images/README.md b/appengine/images/README.md new file mode 100644 index 00000000000..88edaa825f2 --- /dev/null +++ b/appengine/images/README.md @@ -0,0 +1,36 @@ +# Google App Engine Standard Environment Images Sample + +This sample demonstrates how to use the Images Java API. + +See the [Google App Engine standard environment documentation][ae-docs] for more +detailed instructions. + +[ae-docs]: https://cloud.google.com/appengine/docs/java/ + +## Modify the app + +Using the [Google Cloud SDK](https://cloud.google.com/sdk/) create a bucket + + $ gsutil mb YOUR-PROJECT-ID.appspot.com + +* Edit `src/main/java/com/example/appengine/images/ImageServlet.java` and set your `bucket` name. + +## Running locally + + This example uses the + [App Engine maven plugin](https://cloud.google.com/appengine/docs/java/tools/maven). + To run this sample locally: + + $ mvn appengine:devserver + + To see the results of the sample application, open + [localhost:8080](http://localhost:8080) in a web browser. + + +## Deploying + + In the following command, replace YOUR-PROJECT-ID with your + [Google Cloud Project ID](https://developers.google.com/console/help/new/#projectnumber) + and SOME-VERSION with a valid version number. + + $ mvn appengine:update -Dappengine.appId=YOUR-PROJECT-ID -Dappengine.version=SOME-VERSION diff --git a/appengine/images/pom.xml b/appengine/images/pom.xml new file mode 100644 index 00000000000..afd735da9aa --- /dev/null +++ b/appengine/images/pom.xml @@ -0,0 +1,73 @@ + + + 4.0.0 + war + 1.0-SNAPSHOT + com.example.appengine + appengine-images + + + 1.9.24 + + + + com.google.cloud + doc-samples + 1.0.0 + ../.. + + + + + com.google.appengine + appengine-api-1.0-sdk + ${appengine.sdk.version} + + + com.google.appengine.tools + appengine-gcs-client + RELEASE + + + javax.servlet + servlet-api + jar + provided + + + + + ${project.build.directory}/${project.build.finalName}/WEB-INF/classes + + + org.apache.maven.plugins + 3.3 + maven-compiler-plugin + + 1.7 + 1.7 + + + + + com.google.appengine + appengine-maven-plugin + ${appengine.sdk.version} + + + + diff --git a/appengine/images/src/main/java/com/example/appengine/images/ImagesServlet.java b/appengine/images/src/main/java/com/example/appengine/images/ImagesServlet.java new file mode 100644 index 00000000000..a864cd62c64 --- /dev/null +++ b/appengine/images/src/main/java/com/example/appengine/images/ImagesServlet.java @@ -0,0 +1,118 @@ +/** + * Copyright 2015 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.example.appengine.images; +import com.google.appengine.api.blobstore.BlobKey; +import com.google.appengine.api.blobstore.BlobstoreService; +import com.google.appengine.api.blobstore.BlobstoreServiceFactory; +import com.google.appengine.api.images.Image; +import com.google.appengine.api.images.ImagesService; +import com.google.appengine.api.images.ImagesServiceFactory; +import com.google.appengine.api.images.Transform; +import com.google.appengine.tools.cloudstorage.GcsFileOptions; +import com.google.appengine.tools.cloudstorage.GcsFilename; +import com.google.appengine.tools.cloudstorage.GcsService; +import com.google.appengine.tools.cloudstorage.GcsServiceFactory; +import com.google.appengine.tools.cloudstorage.RetryParams; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.PrintWriter; +import java.nio.ByteBuffer; +import java.nio.channels.FileChannel; + +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +// [START example] +@SuppressWarnings("serial") +public class ImagesServlet extends HttpServlet { + final String bucket = "YOUR-BUCKETNAME-HERE"; + + // [START gcs] + private final GcsService gcsService = GcsServiceFactory.createGcsService(new RetryParams.Builder() + .initialRetryDelayMillis(10) + .retryMaxAttempts(10) + .totalRetryPeriodMillis(15000) + .build()); + // [END gcs] + + @Override + public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { + + //[START original_image] + // Read the image.jpg resource into a ByteBuffer. + FileInputStream fileInputStream = new FileInputStream(new File("WEB-INF/image.jpg")); + FileChannel fileChannel = fileInputStream.getChannel(); + ByteBuffer byteBuffer = ByteBuffer.allocate((int)fileChannel.size()); + fileChannel.read(byteBuffer); + + byte[] imageBytes = byteBuffer.array(); + + // Write the original image to Cloud Storage + gcsService.createOrReplace( + new GcsFilename(bucket, "image.jpeg"), + new GcsFileOptions.Builder().mimeType("image/jpeg").build(), + ByteBuffer.wrap(imageBytes)); + //[END original_image] + + //[START resize] + // Get an instance of the imagesService we can use to transform images. + ImagesService imagesService = ImagesServiceFactory.getImagesService(); + + // Make an image directly from a byte array, and transform it. + Image image = ImagesServiceFactory.makeImage(imageBytes); + Transform resize = ImagesServiceFactory.makeResize(100, 50); + Image resizedImage = imagesService.applyTransform(resize, image); + + // Write the transformed image back to a Cloud Storage object. + gcsService.createOrReplace( + new GcsFilename(bucket, "resizedImage.jpeg"), + new GcsFileOptions.Builder().mimeType("image/jpeg").build(), + ByteBuffer.wrap(resizedImage.getImageData())); + //[END resize] + + //[START rotate] + // Make an image from a Cloud Storage object, and transform it. + BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService(); + BlobKey blobKey = blobstoreService.createGsBlobKey("gs://" + bucket + "/image.jpeg"); + Image blobImage = ImagesServiceFactory.makeImageFromBlob(blobKey); + Transform rotate = ImagesServiceFactory.makeRotate(90); + Image rotatedImage = imagesService.applyTransform(rotate, blobImage); + + // Write the transformed image back to a Cloud Storage object. + gcsService.createOrReplace( + new GcsFilename(bucket, "rotatedImage.jpeg"), + new GcsFileOptions.Builder().mimeType("image/jpeg").build(), + ByteBuffer.wrap(rotatedImage.getImageData())); + //[END rotate] + + // Output some simple HTML to display the images we wrote to Cloud Storage + // in the browser. + PrintWriter out = resp.getWriter(); + out.println("\n"); + out.println("AppEngine logo"); + out.println("AppEngine logo resized"); + out.println("AppEngine logo rotated"); + out.println("\n"); + } +} +// [END example] diff --git a/appengine/images/src/main/webapp/WEB-INF/appengine-web.xml b/appengine/images/src/main/webapp/WEB-INF/appengine-web.xml new file mode 100644 index 00000000000..07bb4d7de99 --- /dev/null +++ b/appengine/images/src/main/webapp/WEB-INF/appengine-web.xml @@ -0,0 +1,20 @@ + + + + + + YOUR-PROJECT-ID + YOUR-VERSION + true + diff --git a/appengine/images/src/main/webapp/WEB-INF/image.jpg b/appengine/images/src/main/webapp/WEB-INF/image.jpg new file mode 100644 index 00000000000..3a60da2619d Binary files /dev/null and b/appengine/images/src/main/webapp/WEB-INF/image.jpg differ diff --git a/appengine/images/src/main/webapp/WEB-INF/web.xml b/appengine/images/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 00000000000..8ccba622877 --- /dev/null +++ b/appengine/images/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,14 @@ + + + + images + com.example.appengine.images.ImagesServlet + + + images + / + + diff --git a/pom.xml b/pom.xml index bd885080d87..96369b9ed33 100644 --- a/pom.xml +++ b/pom.xml @@ -46,12 +46,14 @@ appengine/analytics appengine/appidentity appengine/channel + appengine/cloudsql appengine/datastore appengine/datastore/indexes appengine/datastore/indexes-exploding appengine/datastore/indexes-perfect appengine/guestbook-objectify appengine/helloworld + appengine/images appengine/logs appengine/mailgun appengine/mailjet @@ -71,11 +73,13 @@ appengine/xmpp bigquery compute/cmdline + compute/sendgrid datastore logging managed_vms/analytics managed_vms/async-rest managed_vms/cloudstorage + managed_vms/cron managed_vms/datastore managed_vms/disk managed_vms/extending-runtime