# Datei erzeugen und auf der Weboberfläche downloaden (Tomcat)



## Admiral Helmut (6. Mrz 2015)

Hallo liebe Leute,

sitze vor einem Problem. Vielleicht könnt ihr mir helfen.

Habe folgende Architektur:
Ein Embedded Tomcat wird über eine ganz normale Jar gestartet. Wahrscheinlich ist es für das Problem egal ob dieser embedded ist. Dieser WebServer hostet eine Website zur Steuerung. Website und Server kommunizieren über WebSockets. D.H. WebServer hostet auch (um genau zusein) einen Spring WebSocket Endpoint.

Dazu gibt es im Hintergrund einen Haufen Logik der die Ergebnisse an den WebSocket Endpoint sendet und dadurch zur Gui.


Nun möchte ich die Ergebnisse nicht nur anzeigen. Ich möchte bereits auf dem WebSocket Endpoint die Ergebnisse in eine Datei schreiben (denke .csv), diese dann auf dem WebServer speichern und auf die Website einen Link setzen, der den Download der Datei anbietet.


Nun weiss ich nicht ob das so funktionieren kann wie ich mir das vorstelle. Was meint ihr?

Ich denke der Download sollte kein Problem sein wenn ich es schaffe die Datei in den gleichen Ordner auf dem WebServer zu speichern wie die html files. Aber wie speichere ich die Datei vom WebSocket Endpoint direkt in den (bei mir static) Ordner auf dem WebServer.

Die Klassen für den Endpoint liegen ja auf dem gleichen WebServer. Könnte ich nicht über getclass etc den Path bestimmen und dann per ".." zurück navigieren und zum entsprechenden Ordner und dort das File ablegen?


Vielen Dank für eure Bemühungen.

mit freundlichen Grüßen

Helmut


----------



## stg (6. Mrz 2015)

Direkt in der WebApp würde ich gar keine Files ablegen. Bei jedem Redeployment musst du sonst tierisch aufpassen, dass nicht alles gelöscht wird. Was hindert dich daran einfach mit absoluten Pfaden zu arbeiten? Den content aus diesem (externen) folder kannst du ja per Servlet mappen, so dass du auch aus dem web app context darauf zugreifen kannst, wenn das notwendig ist. Wenn du das nicht per Servlet machen willst, kannst du ja auch per Hand direkt das File in den http response schreiben.


----------



## Admiral Helmut (6. Mrz 2015)

Hallo stg,

erstmal vielen Dank für die Antwort.

Hab ich das richtig verstanden? Mit extern meinst du irgendwo auf dem Rechner, auf dem der WebServer gestartet  ist. Also zum Beispiel direkt neben die Jar.

habe leider keine Ahnung von Servlets. Kann mir gerade noch nicht vorstellen wie ich das File dann zum Download anbieten soll. Dachte mir ich setzte einfach einen Link auf das File.

Das File in einen externen Ordner schreiben und laden ist kein Problem.

Funktioniert das irgendwie so:

Man baut auf dem Webserver eine Servlet Klasse. Diese bekommt eine Get Methode. In dieser prüft man ob die angefrage Ressource der Ergebnisdatei entspricht. Dann lädt man diese Datei vom externen Folder und schreibt den Text in die Response?
Bin ich da auf dem richtigen Weg? Dann müsste ich noch schaun wie man ein Servlet richtig registriert und ein Get von der Website aus auslöst.

Vielen Dank für deine Antwort


Gruß Helmut


----------



## stg (6. Mrz 2015)

Genau so war das gemeint, ja.

Ich hab gerade mal gekramt und bin in einem alten Projekt noch fündig geworden. Kannst du dir gerne nach deinen Bedürfnissen anpassen:


```
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/download/*")
public class FileServlet extends HttpServlet {

    private static final String FOLDER = "D:\\PUBLIC";
    
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
                                       throws ServletException, IOException {
        String filename = request.getPathInfo().substring(1);
        File file = new File(FOLDER, filename);
        response.setHeader("Content-Type", getServletContext().getMimeType(filename));
        response.setHeader("Content-Length", String.valueOf(file.length()));
        response
            .setHeader("Content-Disposition", "attachment; filename=\"" + filename + "\"");
        Files.copy(file.toPath(), response.getOutputStream());
    }

}
```

Ich denke, der Code erklärt sich von selbst, wenn es doch Rückfragen gibt, dann stell sie einfach


----------



## Admiral Helmut (6. Mrz 2015)

Hallo stg,

vielen herzlichen Dank für deine Hilfe.

Genau so mach ich das jetzt. Da lerne gleich was über Servlets. 


Gruß Helmut


----------

