/* WebBox - Dein Server. Copyright (C) 2017 Ulrich Hilger, http://uhilger.de This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package de.uhilger.wbx.web; import de.uhilger.wbx.Bild; import java.awt.Container; import java.awt.Image; import java.awt.MediaTracker; import java.awt.Toolkit; import java.io.File; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.util.logging.Level; import java.util.logging.Logger; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.catalina.servlets.DefaultServlet; /** * Mit dem TNServlet kann für eine Bilddatei eine * Miniaturansicht erzeugt werden, wie sie im Dateimanager * der WebBox verwendet wird. * * Unterstuetzt werden die Varianten * 120 (_tn), 240 (_kl), 500 (_dd), 700 (_mt), 1200 (_gr) */ public class TNServlet extends DefaultServlet { private static final Logger logger = Logger.getLogger(TNServlet.class.getName()); /** * Diese String-Konstanten noetigenfalls in eine * Konfigurationsdatei auslagern */ public static final String TN = "_tn"; public static final String KL = "_kl"; public static final String SM = "_sm"; public static final String MT = "_mt"; public static final String GR = "_gr"; public static final String JPG = ".jpg"; public static final String JPEG = ".jpeg"; public static final String PNG = ".png"; /** * Handles the HTTP GET method. * * @param request servlet request * @param response servlet response * @throws ServletException if a servlet-specific error occurs * @throws IOException if an I/O error occurs */ @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String uriStr = request.getRequestURI(); String relname = uriStr.substring(request.getContextPath().length()); // --- Logausgabe Start File logurifile = new File(uriStr); String loguriStr = uriStr.substring(request.getContextPath().length()); File logdir = new File(request.getServletContext().getRealPath("/")); File logimgfile = new File(logdir, loguriStr); StringBuffer buf = new StringBuffer(); buf.append("contextPath: "); buf.append(request.getContextPath()); buf.append("\n"); buf.append("realpath of /: "); buf.append(request.getServletContext().getRealPath("/")); buf.append("\n"); buf.append("urifile: "); buf.append(logurifile.getAbsolutePath()); buf.append("\n"); buf.append("imgfile: "); buf.append(logimgfile.getAbsolutePath()); logger.fine(buf.toString()); // --- Logausgabe Ende if(uriStr.endsWith(JPG) || uriStr.endsWith(JPEG) || uriStr.endsWith(PNG)) { if(uriStr.contains(TN)) { bildAusgeben(request, response, relname, TN, Bild.WINZIG); } else if(uriStr.contains(KL)) { bildAusgeben(request, response, relname, KL, Bild.KLEIN); } else if(uriStr.contains(SM)) { bildAusgeben(request, response, relname, SM, Bild.SEMI); } else if(uriStr.contains(MT)) { bildAusgeben(request, response, relname, MT, Bild.MITTEL); } else if(uriStr.contains(GR)) { bildAusgeben(request, response, relname, GR, Bild.GROSS); } else { super.doGet(request, response); } } else { super.doGet(request, response); } } private void bildAusgeben(HttpServletRequest request, HttpServletResponse response, String relname, String indicator, int bildTyp) throws UnsupportedEncodingException, IOException { File dir = new File(request.getServletContext().getRealPath("/")); relname = relname.replace(indicator, ""); File imgfile = new File(dir, URLDecoder.decode(relname, "utf-8")); Image image = Toolkit.getDefaultToolkit().getImage(imgfile.getAbsolutePath()); MediaTracker mediaTracker = new MediaTracker(new Container()); mediaTracker.addImage(image, 0); try { mediaTracker.waitForID(0); if (!mediaTracker.isErrorAny()) { Bild bild = new Bild(); bild.writeImageStream(image, bild.getVariantenGroesse(bildTyp), bild.getMimeType(imgfile), response.getOutputStream()); } } catch (InterruptedException ex) { logger.log(Level.SEVERE, ex.getLocalizedMessage(), ex); } } }