/*
|
http-image - Image extensions to jdk.httpserver
|
Copyright (C) 2021 Ulrich Hilger
|
|
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 <https://www.gnu.org/licenses/>.
|
*/
|
package de.uhilger.httpserver.image;
|
|
import com.sun.net.httpserver.Filter;
|
import com.sun.net.httpserver.HttpExchange;
|
import de.uhilger.httpserver.base.HttpHelper;
|
import de.uhilger.httpserver.base.handler.FileHandler;
|
import java.io.File;
|
import java.io.IOException;
|
import java.util.logging.Logger;
|
|
/**
|
* Der ImageFilter erzeugt verkleinerte Versionen einer Bilddatei
|
* nach Bedarf. Wenn die gewuenschte Dateigroesse noch nicht existiert
|
* oder die Originaldatei neuer ist als die verkleinerte Fassung,
|
* wird die verkleinerte Fassung neu erzeugt.
|
*
|
* Fuer jede Anfrage, wird geprueft ob eine Bilddatei angefragt ist,
|
* deren Dateiname einen der folgenden Namenszusaetze enthaelt:
|
*
|
* 120 - "_tn"
|
* 240 - "_kl"
|
* 500 - "_sm"
|
* 700 - "_mt"
|
* 1200 - "_gr"
|
*
|
* Fuer diese wird geprueft, ob die Datei existiert. Wenn nicht, wird geprueft,
|
* ob eine Bilddatei mit Dateiname ohne Namenszusatz existiert. Wenn ja, wird
|
* aus dieser Datei die gewuenschte Fassung erzeugt.
|
*
|
* Beispiel:
|
* Fuer die Anfrage nach /daten/mein-bild_tn.png wird aus der Datei
|
* /daten/mein-bild.png eine verkleinerte Fassung der Groesse 120 Bildpunkte
|
* entlang der laengsten Kante erzeugt, als /daten/mein-bild_tn.png gespeichert
|
* und ausgeliefert.
|
*
|
* Der Filter benoetigt das Attribut
|
* FileHandler.ATTR_FILE_BASE
|
* im HttpContext
|
*
|
* @author Ulrich Hilger
|
* @version 1, 30.06.2021
|
*/
|
public class ImageFilter extends Filter {
|
|
private static final Logger logger = Logger.getLogger(ImageFilter.class.getName());
|
|
public static final String DESCRIPTION = "ImageFilter";
|
|
@Override
|
public void doFilter(HttpExchange exchange, Chain chain) throws IOException {
|
String uriStr = exchange.getRequestURI().toString();
|
logger.fine(uriStr);
|
//String ctxPath = exchange.getHttpContext().getPath();
|
//String uriPath = exchange.getRequestURI().getPath();
|
//logger.fine(uriPath);
|
//String fName = uriPath.substring(ctxPath.length());
|
String fName = new HttpHelper().getFileName(exchange);
|
logger.fine(fName);
|
if(uriStr.endsWith(ImageActor.JPG) || uriStr.endsWith(ImageActor.JPEG) || uriStr.endsWith(ImageActor.PNG)) {
|
File dir = new File(exchange.getHttpContext().getAttributes().get(FileHandler.ATTR_FILE_BASE).toString());
|
File imgfile = new File(dir, fName);
|
ImageActor actor = new ImageActor();
|
if(uriStr.contains(ImageActor.TN)) {
|
actor.createImage(dir, fName, ImageActor.TN, 120, imgfile);
|
} else if(uriStr.contains(ImageActor.KL)) {
|
actor.createImage(dir, fName, ImageActor.KL, 240, imgfile);
|
} else if(uriStr.contains(ImageActor.SM)) {
|
actor.createImage(dir, fName, ImageActor.SM, 500, imgfile);
|
} else if(uriStr.contains(ImageActor.MT)) {
|
actor.createImage(dir, fName, ImageActor.MT, 700, imgfile);
|
} else if(uriStr.contains(ImageActor.GR)) {
|
actor.createImage(dir, fName, ImageActor.GR, 1200, imgfile);
|
} else if(uriStr.contains(ImageActor.B64)) {
|
File b64File = imgfile;
|
String fromName = fName.replace(ImageActor.B64, "");
|
File fromfile = new File(dir, fromName);
|
//be.bildErzeugen(dir, fName, BildErzeuger.GR, 1200, imgfile);
|
logger.fine("from: " + fromfile.getAbsolutePath() + ", to: " + b64File.getAbsolutePath());
|
actor.b64Image(fromfile, b64File);
|
}
|
}
|
chain.doFilter(exchange);
|
}
|
|
@Override
|
public String description() {
|
return DESCRIPTION;
|
}
|
|
}
|