# Downloadbox auch ohne Daten erzwingen // Content-Disposition



## spohl1 (14. Mai 2007)

Hallo zusammen,

ich biete einen dynamischen Dateidownload an, der sich die gewünschten Daten aus einer Datenbank liest und dann den Benutzer zur Verfügung stellt.

Aus Performancegründen ist eine vorherige Abfrage auf die Datenbank jedoch nicht möglich, so dass ich leere Datensätze zurückbekomme, in diesem Fall schreibe ich nichts in den Ausgabestream, sondern lese den nächsten Satz.


```
// Dateidownload
  this.rc.res.setContentType("application/csv");
                this.rc.res.setHeader("Content-Disposition",
                    "attachment; filename=\"" + filenamecsv);

                ServletOutputStream out = this.rc.res.getOutputStream();

                // einmalig wurde der Inhalt vorgelesen
                out.write(getModel().export.getCsvFileByteArray());
                out.flush();

                // solange noch weitere Sätze vorhanden sind
                while (getModel().export.getAbrechnungen()
                                                      .size() != 0) {

                        out.write(getModel().export.getCsvFileByteArray());
                        out.flush();
                    }
                }

                out.close();
```

Der Code funktioniert auch einwandfrei, nur das Problem ist, wenn das ByteArray (getModel().export.getCsvFileByteArray()) leer ist, erscheint der Downloaddialog noch nicht, erst wenn die ersten Daten rausgeschrieben werden. Da dies manchmal erst beim 100. Satz ist, dauert es teilweise sehr lange, bis diese Box erscheint und der Anwender klickt erneut...


Ich habe schon probiert, zu Beginn Leerzeichen rauszuschreiben, aber dies funktioniert leider nicht (Box kommt trotzdem nicht). Andere Zeichen wären keine Lösung, denn sonst besitzt die CSV-Datei, die rauskommt, überflüssige Zeichen.

Kennt jemand von euch eine Lösung, um die Downloadbox direkt anzuzeigen?

Vielen Dank
Sebastian


----------



## kleiner_held (14. Mai 2007)

Hast du schon mal den Aufruf von flushBuffer() an der HttpServletResponse probiert?


----------



## spohl1 (14. Mai 2007)

Hallo,

ich habs gerade mal probiert:


```
// Dateidownload 
  this.rc.res.setContentType("application/csv"); 
                this.rc.res.setHeader("Content-Disposition", 
                    "attachment; filename=\"" + filenamecsv); 

                this.rc.res.flushBuffer();  

                ServletOutputStream out = this.rc.res.getOutputStream(); 

                // einmalig wurde der Inhalt vorgelesen 
                out.write(getModel().export.getCsvFileByteArray()); 
                out.flush(); 

                // solange noch weitere Sätze vorhanden sind 
                while (getModel().export.getAbrechnungen() 
                                                      .size() != 0) { 

                        out.write(getModel().export.getCsvFileByteArray()); 
                        out.flush(); 
                    } 
                } 

                out.close();
```

aber leider ohne Erfolg, die Box kommt erst wenn Daten kommen oder falls ich gar keine Daten hab erst beim out.close();

Trotzdem Danke für die schnelle Hilfe...


----------



## kleiner_held (14. Mai 2007)

Hmm das ist sogar irgendwie verstaendlich, der Browser entscheidet wann er die Download-Box oeffnet und das macht er erst wenn wirklich Daten kommen.
Du koenntest hoechstens eine Zeile mit CSV Spaltennamen generieren (wenn die CSV Daten z.B. in einer Tabellenkalkulation eingelesen werden sollen, ist das ja ganz nuetzlich) ansonsten faellt mir kein Weg ein.


----------



## spohl1 (14. Mai 2007)

ja, schon ein wenig verständlich, aber das wollte ich halt mit einem Leerzeichen irgendwie umgehen...

die Lösung mit den Spaltenüberschriften habe ich mir auch schon überlegt, werde ich dann wohl auch machen müssen, es sei denn, irgendeine Lösung gibt es noch.

Vielen Dank!


----------



## Sanix (14. Mai 2007)

Ich würde dir sowieso vorschlagen eine Wait - Anzeige einzublenden, während das Exel - File generiert wird und / oder dem User die Möglichkeit nehmen, dass Excel - Nochmals zu generieren.


----------



## spohl1 (14. Mai 2007)

Danke für den Tipp, ich werde so etwas einbauen.


----------

