/**
* 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.google.apphosting.tests.usercode.testservlets;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Map;
import java.util.Collections;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.google.appengine.api.blobstore.BlobstoreServiceFactory;
import com.google.appengine.api.blobstore.BlobstoreService;
import com.google.appengine.api.blobstore.BlobKey;
import com.google.appengine.api.blobstore.UploadOptions;
public class TestBlobUploadServlet extends HttpServlet {
private BlobstoreService blobstoreService;
static final String UPLOAD_HEADER = "X-AppEngine-BlobUpload";
@Override
public void init() {
this.blobstoreService = BlobstoreServiceFactory.getBlobstoreService();
}
@Override
public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
String target = req.getParameter("target");
if (target == null) {
target = req.getRequestURI();
}
UploadOptions options = UploadOptions.Builder.withDefaults();
String maxUploadSizeString = req.getParameter("max-upload-size");
if (maxUploadSizeString != null) {
try {
options.maxUploadSizeBytes(Long.valueOf(maxUploadSizeString));
} catch (NumberFormatException ex) {
// ignored
}
}
String maxPerBlobSize = req.getParameter("max-per-blob-size");
if (maxPerBlobSize != null) {
try {
options.maxUploadSizeBytesPerBlob(Long.valueOf(maxPerBlobSize));
} catch (NumberFormatException ex) {
// ignored
}
}
String gsBucketName = req.getParameter("gs-bucket-name");
if (gsBucketName != null) {
options.googleStorageBucketName(gsBucketName);
}
String url = blobstoreService.createUploadUrl(target, options);
resp.setContentType("text/html");
PrintWriter out = resp.getWriter();
if (req.getParameter("urlOnly") != null) {
out.print(url);
} else {
out.println("<html><body>");
out.println(
"<form id=form1 method=\"POST\" action=\"" + url + "\" enctype=\"multipart/form-data\">");
out.println("<input id=text1 type=\"text\" name=\"text1\">");
out.println("<input id=file1 type=\"file\" name=\"file1\">");
out.println("<input id=file2 type=\"file\" name=\"file2\">");
out.println("<input id=submit1 type=\"submit\" value=\"Upload\">");
out.println("</body></html>");
}
}
@Override
public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
Map<String, BlobKey> blobs = blobstoreService.getUploadedBlobs(req);
// Verify all of the header accessors contain the upload header.
if (!req.getHeader(UPLOAD_HEADER).equals("true")
|| !Collections.list(req.getHeaderNames()).contains(UPLOAD_HEADER)
|| !Collections.list(req.getHeaders(UPLOAD_HEADER)).contains("true")) {
resp.sendError(
HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
"Expected header to be present: " + UPLOAD_HEADER);
return;
}
try {
req.getIntHeader(UPLOAD_HEADER);
resp.sendError(
HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
"Expected header to be present: " + UPLOAD_HEADER);
return;
} catch (NumberFormatException e) {
}
Map<String, String[]> parameterMap = req.getParameterMap();
if (!parameterMap.containsKey("text1")) {
resp.sendError(
HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
"Expected text1 to be found in the parameterMap.");
}
if (req.getParameter("text1") == null || req.getParameter("text1").length() == 0) {
resp.sendError(
HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Expected non-empty text1 field.");
return;
}
// Verify blob keys are present.
if (blobs.size() == 1) {
BlobKey blobKey =
blobs
.entrySet()
.iterator()
.next()
.getValue();
resp.sendRedirect("/serve-blob?key=" + blobKey.getKeyString());
} else {
resp.sendError(
HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
"Expect one uploaded blob, got " + blobs.size());
}
}
}