Bilder verarbeiten mit Modul jdk.httpserver
ulrich
2021-07-04 70d88857b300e8bcad8d4421d7d87dfdcd8799db
commit | author | age
70d888 1 /*
U 2   http-image - Image extensions to jdk.httpserver
3   Copyright (C) 2021  Ulrich Hilger
4
5   This program is free software: you can redistribute it and/or modify
6   it under the terms of the GNU Affero General Public License as
7   published by the Free Software Foundation, either version 3 of the
8   License, or (at your option) any later version.
9
10   This program is distributed in the hope that it will be useful,
11   but WITHOUT ANY WARRANTY; without even the implied warranty of
12   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13   GNU Affero General Public License for more details.
14
15   You should have received a copy of the GNU Affero General Public License
16   along with this program.  If not, see <https://www.gnu.org/licenses/>.
17  */
18 package de.uhilger.httpserver.image;
19
20 import com.sun.net.httpserver.Filter;
21 import com.sun.net.httpserver.HttpExchange;
22 import de.uhilger.httpserver.base.HttpHelper;
23 import de.uhilger.httpserver.base.handler.FileHandler;
24 import java.io.File;
25 import java.io.IOException;
26 import java.util.logging.Logger;
27
28 /**
29  * Der ImageFilter erzeugt verkleinerte Versionen einer Bilddatei 
30  * nach Bedarf. Wenn die gewuenschte Dateigroesse noch nicht existiert 
31  * oder die Originaldatei neuer ist als die verkleinerte Fassung, 
32  * wird die verkleinerte Fassung neu erzeugt.
33  * 
34  * Fuer jede Anfrage, wird geprueft ob eine Bilddatei angefragt ist, 
35  * deren Dateiname einen der folgenden Namenszusaetze enthaelt:
36  *
37  * 120 - "_tn"
38  * 240 - "_kl"
39  * 500 - "_sm"
40  * 700 - "_mt"
41  * 1200 - "_gr"
42  * 
43  * Fuer diese wird geprueft, ob die Datei existiert. Wenn nicht, wird geprueft, 
44  * ob eine Bilddatei mit Dateiname ohne Namenszusatz existiert. Wenn ja, wird 
45  * aus dieser Datei die gewuenschte Fassung erzeugt.
46  * 
47  * Beispiel:
48  * Fuer die Anfrage nach /daten/mein-bild_tn.png wird aus der Datei
49  * /daten/mein-bild.png eine verkleinerte Fassung der Groesse 120 Bildpunkte 
50  * entlang der laengsten Kante erzeugt, als /daten/mein-bild_tn.png gespeichert 
51  * und ausgeliefert.
52  * 
53  * Der Filter benoetigt das Attribut
54  * FileHandler.ATTR_FILE_BASE 
55  * im HttpContext
56  * 
57  * @author Ulrich Hilger
58  * @version 1, 30.06.2021
59  */
60 public class ImageFilter extends Filter {
61
62   private static final Logger logger = Logger.getLogger(ImageFilter.class.getName());
63   
64   public static final String DESCRIPTION = "ImageFilter";
65   
66   @Override
67   public void doFilter(HttpExchange exchange, Chain chain) throws IOException {
68     String uriStr = exchange.getRequestURI().toString();
69     logger.fine(uriStr);
70     //String ctxPath = exchange.getHttpContext().getPath();
71     //String uriPath = exchange.getRequestURI().getPath();
72     //logger.fine(uriPath);
73     //String fName = uriPath.substring(ctxPath.length());
74     String fName = new HttpHelper().getFileName(exchange);
75     logger.fine(fName);
76     if(uriStr.endsWith(ImageActor.JPG) || uriStr.endsWith(ImageActor.JPEG) || uriStr.endsWith(ImageActor.PNG)) {
77       File dir = new File(exchange.getHttpContext().getAttributes().get(FileHandler.ATTR_FILE_BASE).toString());
78       File imgfile = new File(dir, fName);    
79       ImageActor actor = new ImageActor();
80       if(uriStr.contains(ImageActor.TN)) {
81         actor.createImage(dir, fName, ImageActor.TN, 120, imgfile);
82       } else if(uriStr.contains(ImageActor.KL)) {
83         actor.createImage(dir, fName, ImageActor.KL, 240, imgfile);
84       } else if(uriStr.contains(ImageActor.SM)) {
85         actor.createImage(dir, fName, ImageActor.SM, 500, imgfile);
86       } else if(uriStr.contains(ImageActor.MT)) {
87         actor.createImage(dir, fName, ImageActor.MT, 700, imgfile);
88       } else if(uriStr.contains(ImageActor.GR)) {
89         actor.createImage(dir, fName, ImageActor.GR, 1200, imgfile);
90       } else if(uriStr.contains(ImageActor.B64)) {
91         File b64File = imgfile;
92         String fromName = fName.replace(ImageActor.B64, "");
93         File fromfile = new File(dir, fromName);        
94         //be.bildErzeugen(dir, fName, BildErzeuger.GR, 1200, imgfile);
95         logger.fine("from: " + fromfile.getAbsolutePath() + ", to: " + b64File.getAbsolutePath());
96         actor.b64Image(fromfile, b64File);
97       }     
98     }
99     chain.doFilter(exchange);
100   }
101
102   @Override
103   public String description() {
104     return DESCRIPTION;
105   }
106   
107 }