Downloadbox auch ohne Daten erzwingen // Content-Disposition

Status
Nicht offen für weitere Antworten.

spohl1

Mitglied
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.

Code:
// 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
 

spohl1

Mitglied
Hallo,

ich habs gerade mal probiert:

Code:
// 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

Top Contributor
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

Mitglied
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

Top Contributor
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.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
B eine vom Admin hochgeladene csv -Datei in der Datatable auch von jedem User sichtbar Allgemeines EE 0
C Glassfish Custom Realm (oder wie auch immer man das löst) Allgemeines EE 5
J Programmierweise bei Webframeworks - Nervt es euch auch? Allgemeines EE 4
MQue funkt. encodeURL auch wenn Cookies eingeschalten sind Allgemeines EE 8
Semox Ist Glassfish auch ein Webserver? Allgemeines EE 26
R Sourcen einbinden von J2EE bzw auch für Servlets in Eclipse Allgemeines EE 8
S JSP auch mit Klassen? Allgemeines EE 2
OnDemand JSF Seite lädt ohne ende Allgemeines EE 8
OnDemand Deployen ohne .java Files Allgemeines EE 0
A Listen Ausgabe ohne forEach - JSTL Allgemeines EE 5
P Context and Dependency Injection (CDI) ohne Server Allgemeines EE 6
M Initial data ohne SQL imports? Allgemeines EE 6
D Testen mit Mockito ohne Delegation? Allgemeines EE 2
E Servlet Wie kann ich ohne Hilfe von Eclipse in JBoss mein servlet aufrufen Allgemeines EE 2
LadyMilka Ablaufdiagramm mit/ohne Hibernate Allgemeines EE 2
D Glassfish 3 ohne Cluster Support? Allgemeines EE 1
T Webanwendung ohne Oberfläche Allgemeines EE 5
T Privates Attribut in einer JPA Entitiy Class ohne DB-Spalte? Allgemeines EE 3
B Client starten ohne Eclipse Allgemeines EE 4
V Java-Webservices mit EJB oder ohne? Allgemeines EE 4
B Connection Poll ohne TomCat Allgemeines EE 5
N Warenkorb ohne Datenbank Allgemeines EE 2
J init-Methode eines Servlet ausführen ohne vorherigen request Allgemeines EE 2
S webservice mit tomcat und axis ohne eclipse laufen lassen? Allgemeines EE 2
H Parameterübergabe ohne Formular? Allgemeines EE 7
W deploy-tool ohne GUI? Allgemeines EE 7
TRunKX Werteübergabe von einer *.jsp in eine *.java ohne struts Allgemeines EE 4
B NullPointer ohne message body? Allgemeines EE 3
D JBOSS war aufrufen ohne Projektnamen Allgemeines EE 2
S Kompilieren der JSP-Seiten ohne Aufruf Allgemeines EE 7

Ähnliche Java Themen

Neue Themen


Oben