package org.kvj.lima1.gae.sync.rest; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.amber.oauth2.common.OAuth; import org.kvj.lima1.gae.sync.data.FileStorage; 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.ImagesService.OutputEncoding; import com.google.appengine.api.images.ImagesServiceFactory; import com.google.appengine.api.images.InputSettings; import com.google.appengine.api.images.InputSettings.OrientationCorrection; import com.google.appengine.api.images.OutputSettings; import com.google.appengine.api.images.Transform; public class DownloadServlet extends OAuthSecuredServlet { private static final long serialVersionUID = 1L; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String app = req.getParameter("app"); String name = req.getParameter("name"); log.info("Getting file: " + name); BlobKey file = FileStorage.getFile(app, (String) req.getAttribute(OAuth.OAUTH_CLIENT_ID), name); if (null == file) { throw new ServletException("File not found"); } else { BlobstoreService blobstoreService = BlobstoreServiceFactory .getBlobstoreService(); resp.setHeader("Content-Type", "application/octet-stream"); String width = req.getParameter("width"); if (null != "width") { ImagesService imagesService = ImagesServiceFactory .getImagesService(); Image fromBlob = ImagesServiceFactory.makeImageFromBlob(file); InputSettings inputSettings = new InputSettings(); inputSettings .setOrientationCorrection(OrientationCorrection.CORRECT_ORIENTATION); OutputSettings outputSettings = new OutputSettings( OutputEncoding.JPEG); fromBlob = imagesService.applyTransform( ImagesServiceFactory.makeRotate(0), fromBlob, inputSettings, outputSettings); double mul = Double.parseDouble(width) / fromBlob.getWidth(); // log.info("Transform image (with rotate) " + // fromBlob.getWidth() // + fromBlob.getHeight() + ", " + mul); Transform transform = ImagesServiceFactory.makeResize( (int) Math.ceil(fromBlob.getWidth() * mul), (int) Math.ceil(fromBlob.getHeight() * mul)); Image outImage = imagesService.applyTransform(transform, fromBlob, inputSettings, outputSettings); resp.getOutputStream().write(outImage.getImageData()); resp.flushBuffer(); return; } blobstoreService.serve(file, resp); } } }