# File Donwlad über jsp



## amjed (20. Mai 2009)

Hallo,
in meinem Projekt habe ich eine Klasse die Daten direkt auf Clientseite in einer .txt- Datei speichern soll. Alles funktionniert ganz gut, nur wird der HTML-Code der JSP- Seite im Anschluss an die eigentlichen Daten mitgespeichert?! Hier ist der Code von der Funktion, die für die Zusendung der Datei an den Client zuständig ist:


```
public void downloadBackup(HttpServletRequest req, HttpServletResponse resp, String backupFile)  throws IOException
	{
		File                f        = new File(backupFile);
        int                 length   = 0;
        ServletOutputStream op       = resp.getOutputStream();
                
        //
        //  Set the response and go!
        //
        //
        resp.setContentType( "application/octet-stream" );
        resp.setContentLength( (int)f.length() );
        resp.setHeader( "Content-Disposition", "attachment; filename=\"test1.sql\"" );

        //
        //  Stream to the requester.
        //
        byte[] bbuf = new byte[255];
        DataInputStream in = new DataInputStream(new FileInputStream(f));

        while ((in != null) && ((length = in.read(bbuf)) != -1))
        {
            op.write(bbuf,0,length);
        }

        in.close();
        op.flush();
        op.close();


	}
```

Diese Funktion wird in einer Jsp Seite aufgerufen. Wie soll ich machen um die Zusendung des HTML-Contents im Anschluss der Text-Datei zu verhindern?

Vielen Dank!


----------



## maki (20. Mai 2009)

Wo wird denn downloadBackup aufgerufen?


----------



## amjed (20. Mai 2009)

maki hat gesagt.:


> Wo wird denn downloadBackup aufgerufen?




downloadBackup wird von einer jsp Datei (index.jsp) aufgerufen. Ich kreiere eine Instanz der KLasse dort dann rufe ich die Funktion downloadBackup auf.


----------



## maki (20. Mai 2009)

So etwas sollte man von einem Servlet machen lassen, JSPs sind Template für Textdarstellung.
Der Link kann ja ruhig in einer JSP dargestellt werden, sollte aber auf ein Servlet zeigen.


----------



## amjed (20. Mai 2009)

maki hat gesagt.:


> So etwas sollte man von einem Servlet machen lassen, JSPs sind Template für Textdarstellung.
> Der Link kann ja ruhig in einer JSP dargestellt werden, sollte aber auf ein Servlet zeigen.



Die Funktion wird sowieso in einem Servlet implementiert. Oder meinst du dass der Aufruf der Funktion selbst muss durch ein Servlet stattfinden?Gibt es vielleicht irgendwo im Web ein Besipiel das zeigt, wie man das mit Servlets und jsp das macht?


----------



## maki (20. Mai 2009)

Beschreib das mal genauer, Beispiele gibt es zig-Millionen im Netz.

Normal mache ich das so:
JSP hat einen Link zum Download, dieser link zeigt auf ein Servlet
Wenn das Servlet aufgerufen wird, sendet es die Datei, danach ist Schluss.


----------



## amjed (20. Mai 2009)

maki hat gesagt.:


> Beschreib das mal genauer, Beispiele gibt es zig-Millionen im Netz.
> 
> Normal mache ich das so:
> JSP hat einen Link zum Download, dieser link zeigt auf ein Servlet
> Wenn das Servlet aufgerufen wird, sendet es die Datei, danach ist Schluss.



Der User soll über ein Button bestätigen, dass er eine Backup von einer Datenbank machen will; so sieht das HTML bzw jsp code aus für das formular:


```
<form name="form" action="index.jsp" method="post">

<input type="hidden" name="action" value="backup"></input>

Gzip<input type="radio" name="exportType" value="gzip"></input>
Sql<input type="radio" name="exportType" value="sql" checked></input><br><br>


<button type="submit" value="backup" >Export</button>
</form>
```

beim Submit öffnet sich eine zweite JSP Seite, die die Daten zum Download vorbereitet und dann einen zweiten Forward durchführt:


```
if (action!=null && action.equals("backup"))
{
	MySQLDBManager dbManager= new MySQLDBManager();
	backupFile=dbManager.exportDB("txt");
	request.setAttribute( "forwardModule", "myModule");
	request.setAttribute( "forwardParams", "backupFile="+backupFile);
	backupFile="";
}
```

Die letzte JSP Seite (nach dem Forward) ruft die downloadBackup Funktion, die in einem Servlet implementiert ist und die die Zusendung der DAtei ermöglichet:


```
MySQLDBManager dbManager= new MySQLDBManager();
dbManager.downloadBackup(request,response,backupFile);
```


----------

