11package com .example ;
22
33import com .sun .net .httpserver .HttpServer ;
4+ import com .sun .net .httpserver .HttpExchange ;
5+
46import java .io .IOException ;
5- import java .nio . file .* ;
7+ import java .io . OutputStream ;
68import java .net .InetSocketAddress ;
9+ import java .nio .file .*;
710import java .util .UUID ;
811
912public class ImageServer {
@@ -14,57 +17,92 @@ public class ImageServer {
1417
1518 public ImageServer (int port ) throws IOException {
1619 this .port = port ;
17- this .imageDir = Paths .get ("uploaded-images" );
18- if (!Files .exists (imageDir )) Files .createDirectory (imageDir );
20+ this .imageDir = Paths .get ("uploaded-images" ).toAbsolutePath ().normalize ();
21+
22+ if (!Files .exists (imageDir )) {
23+ Files .createDirectories (imageDir );
24+ }
25+
1926 startServer ();
2027 }
2128
2229 private void startServer () throws IOException {
2330 server = HttpServer .create (new InetSocketAddress (port ), 0 );
2431
25- // Hantera bilduppladdning
32+ // -------------------------------------------------------
33+ // UPLOAD HANDLER
34+ // -------------------------------------------------------
2635 server .createContext ("/upload" , exchange -> {
2736 try {
28- if ("POST" .equals (exchange .getRequestMethod ())) {
29- String filename = UUID .randomUUID () + ".jpg" ;
30- Path filePath = imageDir .resolve (filename );
31-
32- try {
33- Files .copy (exchange .getRequestBody (), filePath , StandardCopyOption .REPLACE_EXISTING );
34- } catch (IOException e ) {
35- System .err .println ("❌ Failed to save uploaded file: " + e .getMessage ());
36- exchange .sendResponseHeaders (500 , -1 );
37- return ;
38- }
39-
40- String imageUrl = "http://localhost:" + port + "/images/" + filename ;
41- byte [] response = imageUrl .getBytes ();
42- try {
43- exchange .sendResponseHeaders (200 , response .length );
44- exchange .getResponseBody ().write (response );
45- } catch (IOException e ) {
46- System .err .println ("❌ Failed to write response: " + e .getMessage ());
47- }
37+ if (!"POST" .equals (exchange .getRequestMethod ())) {
38+ exchange .sendResponseHeaders (405 , -1 );
39+ return ;
4840 }
41+
42+ String filename = UUID .randomUUID () + ".jpg" ;
43+ Path filePath = imageDir .resolve (filename ).normalize ();
44+
45+ // Extra säkerhet: kontrollera att filen ligger inne i imageDir
46+ if (!filePath .startsWith (imageDir )) {
47+ exchange .sendResponseHeaders (403 , -1 );
48+ return ;
49+ }
50+
51+ try {
52+ Files .copy (exchange .getRequestBody (), filePath , StandardCopyOption .REPLACE_EXISTING );
53+ } catch (IOException e ) {
54+ System .err .println ("❌ Failed to save uploaded file: " + e .getMessage ());
55+ exchange .sendResponseHeaders (500 , -1 );
56+ return ;
57+ }
58+
59+ String imageUrl = "http://localhost:" + port + "/images/" + filename ;
60+ byte [] response = imageUrl .getBytes ();
61+
62+ try (OutputStream os = exchange .getResponseBody ()) {
63+ exchange .sendResponseHeaders (200 , response .length );
64+ os .write (response );
65+ }
66+
4967 } finally {
5068 exchange .close ();
5169 }
5270 });
5371
54- // Visa uppladdade bilder
72+ // -------------------------------------------------------
73+ // IMAGE FETCH HANDLER /images/xxx
74+ // -------------------------------------------------------
5575 server .createContext ("/images" , exchange -> {
5676 try {
57- Path filePath = imageDir .resolve (exchange .getRequestURI ().getPath ().replace ("/images/" , "" ));
58- if (Files .exists (filePath )) {
59- exchange .sendResponseHeaders (200 , Files .size (filePath ));
60- try {
61- Files .copy (filePath , exchange .getResponseBody ());
62- } catch (IOException e ) {
63- System .err .println ("❌ Failed to send image: " + e .getMessage ());
64- }
65- } else {
77+ String rawPath = exchange .getRequestURI ().getPath ().replace ("/images/" , "" );
78+ if (rawPath .isBlank ()) {
79+ exchange .sendResponseHeaders (400 , -1 );
80+ return ;
81+ }
82+
83+ Path requested = imageDir .resolve (rawPath ).normalize ();
84+
85+ if (!requested .startsWith (imageDir )) {
86+ exchange .sendResponseHeaders (403 , -1 );
87+ return ;
88+ }
89+
90+ if (!Files .exists (requested )) {
6691 exchange .sendResponseHeaders (404 , -1 );
92+ return ;
93+ }
94+
95+ String contentType = Files .probeContentType (requested );
96+ if (contentType == null ) contentType = "application/octet-stream" ;
97+ exchange .getResponseHeaders ().add ("Content-Type" , contentType );
98+
99+ long size = Files .size (requested );
100+
101+ exchange .sendResponseHeaders (200 , size );
102+ try (OutputStream os = exchange .getResponseBody ()) {
103+ Files .copy (requested , os );
67104 }
105+
68106 } finally {
69107 exchange .close ();
70108 }
@@ -78,6 +116,7 @@ private void startServer() throws IOException {
78116 public void stop () {
79117 if (server != null ) {
80118 server .stop (0 );
119+ System .out .println ("🛑 Image server stopped" );
81120 }
82121 }
83122}
0 commit comments