2016-05-25 12 views
0

Ich entwickelte eine JavaWebApplication in IBMBluemix die Liberty mit für Java-runtime. In meiner Anwendung erstelle ich einige csv Dateien, die ich meinen Benutzern als Download anbieten möchte.IBM Bluemix Freiheit für Java öffentlich zugängliches Verzeichnis

Leider konnte ich nicht herausfinden, wo ich diese Dateien schreiben muss. Die URL sollte wie http://myapp.eu-gb.mybluemix.net/test.csv oder vielleicht http://myapp.eu-gb.mybluemix.net/download/test.csv sein

Muss ich eine Route in meiner Datei server.xml angeben?

Ich wäre sehr dankbar, wenn Sie mir helfen könnten. Gruß Lukas.

Antwort

0

Bitte beachten Sie, dass in der Cloud die Bereitstellung einer Anwendung (speziell auf eine Cloud Foundry-basierte Plattform) einige Überlegungen in Bezug auf das lokale Dateisystem erfordert:

  • Lokale Dateisystemspeicher ist kurzlebig. Wenn eine Anwendungsinstanz abstürzt oder abstürzt, werden die dieser Instanz zugewiesenen Ressourcen von der Plattform zurückgeholt, einschließlich aller lokalen Festplattenänderungen, die seit dem Start der Anwendung vorgenommen wurden. Wenn die Instanz neu gestartet wird, startet die Anwendung mit einem neuen Datenträgerabbild. Obwohl Ihre Anwendung während der Ausführung lokale Dateien schreiben kann, verschwinden die Dateien nach dem Neustart der Anwendung.
  • Instanzen der gleichen Anwendung teilen kein lokales Dateisystem. Jede Anwendungsinstanz wird in einem eigenen isolierten Container ausgeführt. Wenn Ihre Anwendung also benötigt, dass die Daten in den Dateien über Neustarts von Anwendungen hinweg erhalten bleiben oder die Daten über alle laufenden Instanzen der Anwendung verteilt werden müssen, sollte das lokale Dateisystem nicht verwendet werden.

Wenn Sie mehr Informationen zu diesem Thema wünschen, werfen Sie einen Blick auf Considerations for Designing and Running an Application in the Cloud.

Ich empfehle Ihnen, einen Blick auf die Object Storage Service auf Bluemix, die Ihre Daten zu speichern und über eine API abrufen können.

+0

Vielen Dank für Ihre Antwort.Ich wusste nichts über diese Fakten. Aber diese Einschränkungen werden mich nicht stören, da die CSV-Dateien nur temporär zum Download gespeichert werden und danach gelöscht werden können. Außerdem muss ich nur eine App-Instanz aufrufen. Deshalb ist auch der zweite Punkt kein Problem. Könnten Sie mir dennoch sagen, wo ich meine Dateien im lokalen Dateisystem speichern und über eine URL zugänglich machen soll? – lukasl1991

+0

Ich würde den Objektspeicher verwenden, aber wenn Sie das mit dem Dateisystem tun möchten, könnten Sie einfach die Datei in einem Pfad Ihrer Wahl speichern und dann die URL zuordnen, die Sie benötigen, um eine Servlet-Methode, die im selben Pfad geht, abzurufen die Datei und sendet es in der Antwort. –

+0

Aber mit dieser Lösung muss ich jede heruntergeladene Datei auf meinem Server öffnen, ihre Zeilen lesen und sie in meine Antwort schreiben. Gibt es keine Lösung, indem Sie einfach eine URL einem Download-Verzeichnis zuordnen? – lukasl1991

0

Können Sie die Datei nicht sofort herunterladen? Anstatt die Daten in eine FileWriter oder zu schreiben, schreiben Sie die Daten in eine PrintWriter oder OutputStream, erhalten von der HttpServletResponse.

Zum Beispiel:

response.setContentType("text/csv"); 
OutputStream outputStream=response.getOutputStream(); 
writeCsvData(outputStream); 

oder

response.setContentType("text/csv"); 
PrintWriter writer=response.getWriter(); 
writeCsvData(writer); 
+0

Danke oder deine Antwort! Unglücklicherweise könnte es mehr als eine CSV-Datei sein und nach der Erstellung von ihnen, sollte der Benutzer entscheiden, ob und welche Dateien er herunterladen möchte. Es ist die funktionale Anforderung ... Aber wie bereits in der anderen Antwort kommentiert, werden die CSV-Dateien nur vorübergehend zum Download gespeichert und können danach gelöscht werden. Das wäre also kein Problem ... Aber ich muss das über eine URL zugänglich machen. – lukasl1991

+0

Hier ist ZipOutputStream nützlich. Die Benutzer wählen die Dateien aus, Sie generieren sie in einem Zip-Ausgabestream und der Benutzer erhält eine ZIP-Datei mit der gesamten CSV-Datei. Auch hier muss nichts auf der Festplatte gespeichert werden. –

+0

Entschuldigung für meine späte Antwort. Der Workflow ist wie folgt: Der Benutzer klickt einen Knopf, dann erzeuge ich die CSV-Daten auf meinem Server. Danach kann der Benutzer die verfügbaren CSV-Dateien ankreuzen und einen Download-Button anklicken. Deshalb muss ich die Dateien speichern. – lukasl1991

0

Zugegeben, dass Sie voll und ganz bewusst der Fragen sind im Zusammenhang mit den ephemeral file system in Cloud Foundry, sollten Sie in der Lage sein, den tatsächlichen Pfad bekommen Ihre Anwendung auf der Festplatte über ServetContext.getRealPath('/') Anruf. Wenn Sie nun eine einfache Webanwendung bereitstellen, können Sie Dateien an diesen Speicherort schreiben und über http://<appName>.mybluemix.net/<file> zugänglich machen. Dies sollte auch funktionieren, wenn Sie einen Nicht-Root-Kontextpfad verwenden oder Dateien in einem Unterverzeichnis speichern möchten (sofern dieses Unterverzeichnis nicht WEB-INF oder META-INF ist).

+0

Danke für Ihren Hinweis! Aber ich bekomme den Fehler: Kann nicht einen statischen Verweis auf die nicht-statische Methode getRealPath (String) vom Typ ServletContext – lukasl1991

+0

OK, getServletContext(). GetRealPath ("/") arbeitete für mich. Ich bekomme /home/vcap/app/wlp/usr/servers/defaultServer/apps/myapp.war als realPath. Aber wenn ich den csv an diesen Ort schreibe, könnte ich nicht darauf zugreifen, wie du vorher geschrieben hast ... – lukasl1991