Bilder mit Neon 2 verwenden
ulrich
6 days ago 58f5c30897596a1139c579704ea9f92b62bc9bf9
commit | author | age
ef2fb2 1 /*
U 2   neon-image - Image extensions to Neon
3   Copyright (C) 2024  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.neon.image;
19
20 import com.sun.net.httpserver.Filter;
21 import com.sun.net.httpserver.HttpExchange;
22 import de.uhilger.neon.FileServer;
58f5c3 23 import de.uhilger.neon.HttpHelper;
ef2fb2 24 import java.io.IOException;
U 25
26 /**
27  * Der ImageFilter erzeugt verkleinerte Versionen einer Bilddatei 
28  * nach Bedarf. Wenn die gewuenschte Dateigroesse noch nicht existiert 
29  * oder die Originaldatei neuer ist als die verkleinerte Fassung, 
30  * wird die verkleinerte Fassung neu erzeugt.
31  * 
32  * Fuer jede Anfrage, wird geprueft ob eine Bilddatei angefragt ist, 
33  * deren Dateiname einen der folgenden Namenszusaetze enthaelt:
34  *
35  * 120 - "_tn"
36  * 240 - "_kl"
37  * 500 - "_sm"
38  * 700 - "_mt"
39  * 1200 - "_gr"
40  * 
41  * Fuer diese wird geprueft, ob die Datei existiert. Wenn nicht, wird geprueft, 
42  * ob eine Bilddatei mit Dateiname ohne Namenszusatz existiert. Wenn ja, wird 
43  * aus dieser Datei die gewuenschte Fassung erzeugt.
44  * 
45  * Beispiel:
46  * Fuer die Anfrage nach /daten/mein-bild_tn.png wird aus der Datei
47  * /daten/mein-bild.png eine verkleinerte Fassung der Groesse 120 Bildpunkte 
48  * entlang der laengsten Kante erzeugt, als /daten/mein-bild_tn.png gespeichert 
49  * und ausgeliefert.
50  * 
51  * Der Filter benoetigt das Attribut
52  * FileHandler.ATTR_FILE_BASE 
53  * im HttpContext
54  * 
55  * @author Ulrich Hilger
56  * @version 1, 30.06.2021
57  */
58 public class ImageFilter extends Filter {
59
60   public static final String DESCRIPTION = "ImageFilter";
61   
62   @Override
63   public void doFilter(HttpExchange exchange, Chain chain) throws IOException {
f7b9ad 64     /*
U 65       Regex fuer Bilder
66       .+\.jpg|.+\.jpeg|.+\.png
67       (Testen z.B. auf https://regexr.com/)
68     */
69     String pattern = (String) exchange.getHttpContext().getAttributes()
70             .getOrDefault("imageFilterPattern", ".+\\.jpg|.+\\.jpeg|.+\\.png");
ef2fb2 71     String uriStr = exchange.getRequestURI().toString();
58f5c3 72     try {
U 73       String fName = new HttpHelper().getFileName(exchange);
74       if(uriStr.toLowerCase().matches(pattern)) {
75         String fileBase = (String) exchange.getHttpContext().getAttributes()
76                 .get(FileServer.ATTR_FILE_BASE);
77         String fileName = exchange
78                 .getRequestURI()
79                 .getPath()
80                 .substring(exchange
81                         .getHttpContext()
82                         .getPath()
83                         .length());          
84         new ImageWorker().createImages(fileBase, fileName, uriStr);
85       }
86     } catch(IllegalArgumentException ex) {
87       // ungueltiger Dateiname, keine Transformation noetig, tue nichts
88     } finally {
89       chain.doFilter(exchange);
f7b9ad 90     }
ef2fb2 91   }
U 92
93   @Override
94   public String description() {
95     return DESCRIPTION;
96   }
97   
98 }