Skip to content

Commit 14ddc54

Browse files
committed
Submit Images (GoogleCloudPlatform#221)
A few modules weren’t added to pom as well, that should be fixed.
1 parent 1615059 commit 14ddc54

File tree

7 files changed

+265
-0
lines changed

7 files changed

+265
-0
lines changed

appengine/images/README.md

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
# Google App Engine Standard Environment Images Sample
2+
3+
This sample demonstrates how to use the Images Java API.
4+
5+
See the [Google App Engine standard environment documentation][ae-docs] for more
6+
detailed instructions.
7+
8+
[ae-docs]: https://cloud.google.com/appengine/docs/java/
9+
10+
## Modify the app
11+
12+
Using the [Google Cloud SDK](https://cloud.google.com/sdk/) create a bucket
13+
14+
$ gsutil mb YOUR-PROJECT-ID.appspot.com
15+
16+
* Edit `src/main/java/com/example/appengine/images/ImageServlet.java` and set your `bucket` name.
17+
18+
## Running locally
19+
20+
This example uses the
21+
[App Engine maven plugin](https://cloud.google.com/appengine/docs/java/tools/maven).
22+
To run this sample locally:
23+
24+
$ mvn appengine:devserver
25+
26+
To see the results of the sample application, open
27+
[localhost:8080](http://localhost:8080) in a web browser.
28+
29+
30+
## Deploying
31+
32+
In the following command, replace YOUR-PROJECT-ID with your
33+
[Google Cloud Project ID](https://developers.google.com/console/help/new/#projectnumber)
34+
and SOME-VERSION with a valid version number.
35+
36+
$ mvn appengine:update -Dappengine.appId=YOUR-PROJECT-ID -Dappengine.version=SOME-VERSION

appengine/images/pom.xml

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
<!--
2+
Copyright 2015 Google Inc. All Rights Reserved.
3+
4+
Licensed under the Apache License, Version 2.0 (the "License");
5+
you may not use this file except in compliance with the License.
6+
You may obtain a copy of the License at
7+
8+
http://www.apache.org/licenses/LICENSE-2.0
9+
10+
Unless required by applicable law or agreed to in writing, software
11+
distributed under the License is distributed on an "AS IS" BASIS,
12+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
See the License for the specific language governing permissions and
14+
limitations under the License.
15+
-->
16+
<project>
17+
<modelVersion>4.0.0</modelVersion>
18+
<packaging>war</packaging>
19+
<version>1.0-SNAPSHOT</version>
20+
<groupId>com.example.appengine</groupId>
21+
<artifactId>appengine-images</artifactId>
22+
23+
<properties>
24+
<appengine.sdk.version>1.9.24</appengine.sdk.version>
25+
</properties>
26+
27+
<parent>
28+
<groupId>com.google.cloud</groupId>
29+
<artifactId>doc-samples</artifactId>
30+
<version>1.0.0</version>
31+
<relativePath>../..</relativePath>
32+
</parent>
33+
34+
<dependencies>
35+
<dependency>
36+
<groupId>com.google.appengine</groupId>
37+
<artifactId>appengine-api-1.0-sdk</artifactId>
38+
<version>${appengine.sdk.version}</version>
39+
</dependency>
40+
<dependency>
41+
<groupId>com.google.appengine.tools</groupId>
42+
<artifactId>appengine-gcs-client</artifactId>
43+
<version>RELEASE</version>
44+
</dependency>
45+
<dependency>
46+
<groupId>javax.servlet</groupId>
47+
<artifactId>servlet-api</artifactId>
48+
<type>jar</type>
49+
<scope>provided</scope>
50+
</dependency>
51+
</dependencies>
52+
<build>
53+
<!-- for hot reload of the web application -->
54+
<outputDirectory>${project.build.directory}/${project.build.finalName}/WEB-INF/classes</outputDirectory>
55+
<plugins>
56+
<plugin>
57+
<groupId>org.apache.maven.plugins</groupId>
58+
<version>3.3</version>
59+
<artifactId>maven-compiler-plugin</artifactId>
60+
<configuration>
61+
<source>1.7</source>
62+
<target>1.7</target>
63+
</configuration>
64+
</plugin>
65+
<!-- Parent POM defines ${appengine.sdk.version} (updates frequently). -->
66+
<plugin>
67+
<groupId>com.google.appengine</groupId>
68+
<artifactId>appengine-maven-plugin</artifactId>
69+
<version>${appengine.sdk.version}</version>
70+
</plugin>
71+
</plugins>
72+
</build>
73+
</project>
Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
/**
2+
* Copyright 2015 Google Inc. All Rights Reserved.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package com.example.appengine.images;
18+
import com.google.appengine.api.blobstore.BlobKey;
19+
import com.google.appengine.api.blobstore.BlobstoreService;
20+
import com.google.appengine.api.blobstore.BlobstoreServiceFactory;
21+
import com.google.appengine.api.images.Image;
22+
import com.google.appengine.api.images.ImagesService;
23+
import com.google.appengine.api.images.ImagesServiceFactory;
24+
import com.google.appengine.api.images.Transform;
25+
import com.google.appengine.tools.cloudstorage.GcsFileOptions;
26+
import com.google.appengine.tools.cloudstorage.GcsFilename;
27+
import com.google.appengine.tools.cloudstorage.GcsService;
28+
import com.google.appengine.tools.cloudstorage.GcsServiceFactory;
29+
import com.google.appengine.tools.cloudstorage.RetryParams;
30+
31+
import java.io.File;
32+
import java.io.FileInputStream;
33+
import java.io.IOException;
34+
import java.io.PrintWriter;
35+
import java.nio.ByteBuffer;
36+
import java.nio.channels.FileChannel;
37+
38+
import javax.servlet.http.HttpServlet;
39+
import javax.servlet.http.HttpServletRequest;
40+
import javax.servlet.http.HttpServletResponse;
41+
42+
// [START example]
43+
@SuppressWarnings("serial")
44+
public class ImagesServlet extends HttpServlet {
45+
final String bucket = "YOUR-BUCKETNAME-HERE";
46+
47+
// [START gcs]
48+
private final GcsService gcsService = GcsServiceFactory.createGcsService(new RetryParams.Builder()
49+
.initialRetryDelayMillis(10)
50+
.retryMaxAttempts(10)
51+
.totalRetryPeriodMillis(15000)
52+
.build());
53+
// [END gcs]
54+
55+
@Override
56+
public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
57+
58+
//[START original_image]
59+
// Read the image.jpg resource into a ByteBuffer.
60+
FileInputStream fileInputStream = new FileInputStream(new File("WEB-INF/image.jpg"));
61+
FileChannel fileChannel = fileInputStream.getChannel();
62+
ByteBuffer byteBuffer = ByteBuffer.allocate((int)fileChannel.size());
63+
fileChannel.read(byteBuffer);
64+
65+
byte[] imageBytes = byteBuffer.array();
66+
67+
// Write the original image to Cloud Storage
68+
gcsService.createOrReplace(
69+
new GcsFilename(bucket, "image.jpeg"),
70+
new GcsFileOptions.Builder().mimeType("image/jpeg").build(),
71+
ByteBuffer.wrap(imageBytes));
72+
//[END original_image]
73+
74+
//[START resize]
75+
// Get an instance of the imagesService we can use to transform images.
76+
ImagesService imagesService = ImagesServiceFactory.getImagesService();
77+
78+
// Make an image directly from a byte array, and transform it.
79+
Image image = ImagesServiceFactory.makeImage(imageBytes);
80+
Transform resize = ImagesServiceFactory.makeResize(100, 50);
81+
Image resizedImage = imagesService.applyTransform(resize, image);
82+
83+
// Write the transformed image back to a Cloud Storage object.
84+
gcsService.createOrReplace(
85+
new GcsFilename(bucket, "resizedImage.jpeg"),
86+
new GcsFileOptions.Builder().mimeType("image/jpeg").build(),
87+
ByteBuffer.wrap(resizedImage.getImageData()));
88+
//[END resize]
89+
90+
//[START rotate]
91+
// Make an image from a Cloud Storage object, and transform it.
92+
BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService();
93+
BlobKey blobKey = blobstoreService.createGsBlobKey("gs://" + bucket + "/image.jpeg");
94+
Image blobImage = ImagesServiceFactory.makeImageFromBlob(blobKey);
95+
Transform rotate = ImagesServiceFactory.makeRotate(90);
96+
Image rotatedImage = imagesService.applyTransform(rotate, blobImage);
97+
98+
// Write the transformed image back to a Cloud Storage object.
99+
gcsService.createOrReplace(
100+
new GcsFilename(bucket, "rotatedImage.jpeg"),
101+
new GcsFileOptions.Builder().mimeType("image/jpeg").build(),
102+
ByteBuffer.wrap(rotatedImage.getImageData()));
103+
//[END rotate]
104+
105+
// Output some simple HTML to display the images we wrote to Cloud Storage
106+
// in the browser.
107+
PrintWriter out = resp.getWriter();
108+
out.println("<html><body>\n");
109+
out.println("<img src='//storage.cloud.google.com/" + bucket
110+
+ "/image.jpeg' alt='AppEngine logo' />");
111+
out.println("<img src='//storage.cloud.google.com/" + bucket
112+
+ "/resizedImage.jpeg' alt='AppEngine logo resized' />");
113+
out.println("<img src='//storage.cloud.google.com/" + bucket
114+
+ "/rotatedImage.jpeg' alt='AppEngine logo rotated' />");
115+
out.println("</body></html>\n");
116+
}
117+
}
118+
// [END example]
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<!-- [START_EXCLUDE] -->
3+
<!--
4+
Copyright 2016 Google Inc. All Rights Reserved.
5+
Licensed under the Apache License, Version 2.0 (the "License");
6+
you may not use this file except in compliance with the License.
7+
You may obtain a copy of the License at
8+
http://www.apache.org/licenses/LICENSE-2.0
9+
Unless required by applicable law or agreed to in writing, software
10+
distributed under the License is distributed on an "AS IS" BASIS,
11+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
See the License for the specific language governing permissions and
13+
limitations under the License.
14+
-->
15+
<!-- [END_EXCLUDE] -->
16+
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
17+
<application>YOUR-PROJECT-ID</application>
18+
<version>YOUR-VERSION</version>
19+
<threadsafe>true</threadsafe>
20+
</appengine-web-app>
Loading
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee"
3+
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
4+
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
5+
version="2.5">
6+
<servlet>
7+
<servlet-name>images</servlet-name>
8+
<servlet-class>com.example.appengine.images.ImagesServlet</servlet-class>
9+
</servlet>
10+
<servlet-mapping>
11+
<servlet-name>images</servlet-name>
12+
<url-pattern>/</url-pattern>
13+
</servlet-mapping>
14+
</web-app>

pom.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,12 +46,14 @@
4646
<module>appengine/analytics</module>
4747
<module>appengine/appidentity</module>
4848
<module>appengine/channel</module>
49+
<module>appengine/cloudsql</module>
4950
<module>appengine/datastore</module>
5051
<module>appengine/datastore/indexes</module>
5152
<module>appengine/datastore/indexes-exploding</module>
5253
<module>appengine/datastore/indexes-perfect</module>
5354
<module>appengine/guestbook-objectify</module>
5455
<module>appengine/helloworld</module>
56+
<module>appengine/images</module>
5557
<module>appengine/logs</module>
5658
<module>appengine/mailgun</module>
5759
<module>appengine/mailjet</module>
@@ -71,11 +73,13 @@
7173
<module>appengine/xmpp</module>
7274
<module>bigquery</module>
7375
<module>compute/cmdline</module>
76+
<module>compute/sendgrid</module>
7477
<module>datastore</module>
7578
<module>logging</module>
7679
<module>managed_vms/analytics</module>
7780
<module>managed_vms/async-rest</module>
7881
<module>managed_vms/cloudstorage</module>
82+
<module>managed_vms/cron</module>
7983
<module>managed_vms/datastore</module>
8084
<module>managed_vms/disk</module>
8185
<module>managed_vms/extending-runtime</module>

0 commit comments

Comments
 (0)