Datei erzeugen und zum Download anbieten

Crod

Mitglied
Hallo Leute,

ich habe eine Frage zu einer Webanwendung.

Ich habe einen Controller, dieser ruft eine Serviceklasse auf, die wiederum einen Export von Daten aus der Datenbank durchführt und diese in eine txt Datei schreibt. Nun würde ich gerne,dass diese Datei so an die View zurück gegeben wird, dass beim User im Browser ein Download Dialog erscheint. Wie ist dies möglich? Und ist es evtl. auch möglich, dass ganze zu realisieren, ohne die Datei auf dem Server zwischen zu speichern?

Viel Dank
Torben
 
Setz doch einfach im Response den ContentHeader entsprechend und schreib den Dateiinhalt in den Response.

Gruß
Ollie
 
Hallo Oliver,

ich mache das leider zum ersten Mal. Nutzen tu ich dazu Spring Web MVC.
Ich weiß zwar nicht wie das mit dem Response geht, aber ich denke der Hinweis wird reichen. Ich versuche es nachher mal. Vielen Dank.

Gruß
Torben
 
Er hat leider nicht gereicht.
Kann evtl. jemand noch mal ein wenig mehr darauf eingehen? :)

Bis dato sieht es noch so aus:

Code:
protected final ModelAndView handleRequestInternal
(final HttpServletRequest request, final HttpServletResponse response) 
throws Exception {

      this.exportService.exportiereDaten("Z");
      return new ModelAndView();

}

Und in der exportiereDaten Methode wird bis dato noch eine Datei erzeugt, die lokal gespeichert wird.

Code:
public final void exportiereDaten(final String anMessekennung) {
		this.messekennung = anMessekennung;
		BufferedWriter writer = null;
		try {
			writer = new BufferedWriter(new FileWriter(new File("C:/Peter.txt")));
			this.holeDaten(writer);
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				if (writer != null) {
					writer.flush();
					writer.close();
				}
			} catch (IOException ex) {
				ex.printStackTrace();
			}
		}
	}

Ich habe hier im Forum zwra ein wenig dazu gefunden. Allerdings nichts, wo etwas genauer darauf eingegangen wird. Ein Link würde mich auch reichen, wo es ein wenig erklärt wird. Finde über Google nichts gescheites.

Sowas habe ich schon versucht:

Code:
public final ModelAndView handleRequest(final HttpServletRequest request, final HttpServletResponse response) {
		File test = this.exportService.exportiereDaten("Z");
		response.setContentType("application/x-msexcel");
		response.setHeader("Content-Disposition", "attachment;filename=" + test.getName() + " ");
		return new ModelAndView();
	}

Aber sobald ich dann über response.getOutputStream den OutputStream aufrufen will kriege ich folgenden Fehler:
getOutputStream() has already been called

Gruß
Torben
 
Zuletzt bearbeitet:
Hast du getOutputStream() vorher schonmal gerufen? Du solltest auf jeden Fall null als ModelAndView zurückgeben.

Gruß
Ollie
 
Hallo Oliver,

nein ich habe das nirgends aufgerufen. Das scheint Spring irgendwo zu machen, kann sonst ja nicht angehen. Ich habe es daher mal mit response.getWriter() versucht, was keine Probleme gibt.

Bis dato sieht mein Versuch so aus:

Code:
	protected final ModelAndView handleRequestInternal(final HttpServletRequest request, final HttpServletResponse response)
			throws Exception {

		response.setContentType("application/octet-stream");
		response.setHeader("Content-Disposition", "attachment;filename=export.csv");
		this.exportService.exportiereDaten("Z", response.getWriter());

		return null;
	}

Code:
public final void exportiereDaten(final String anMessekennung, final PrintWriter pw) {
		this.messekennung = anMessekennung;
		BufferedWriter writer = null;
		try {
			writer = new BufferedWriter(pw);
			this.holeDaten(writer);
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				if (writer != null) {
					writer.flush();
					writer.close();
				}
			} catch (IOException ex) {
				ex.printStackTrace();
			}
		}
	}

Ich übergebe also direkt die Writer Referenz an meine Exportmethode und schreibe dort mit Hifle eines BufferedWriter die Daten. Funktioniert auch anscheinend oder ist das eine unschöne Lösung?

Gruß
Torben
 
Zuletzt bearbeitet:
Hm, komisch ist das schon, zumal die Methode mit dem Outputstream eigentlich überall empfohlen wird. Nunja, solang es tut ;)

REINHAUN!
 

Neue Beiträge

Zurück