2012-05-04 7 views
5

Ich weiß nicht, wie Sie eine CSV-Datei herunterladen. Die CSV wird zur Laufzeit generiert. Muss ich die Datei zuerst im Tomcat WEB-INF-Verzeichnis speichern? Ich benutze JSF 1.2.Herunterladen einer CSV-Datei mit JSF

Übrigens, was ist die bevorzugte JSF-Komponente für diese Art von Aufgabe?


Edit (05.05.2012 - 15.53)

habe ich versucht, die Lösung BalusC erklärte in seinem ersten link, aber wenn ich den Inhalt der Datei auf meinem Befehlsschaltfläche klicken Sie auf der Webseite angezeigt. Vielleicht gibt es ein Problem mit der mimetype?

xhtml-Datei:

<a4j:form> 
    <a4j:commandButton action="#{surveyEvaluationBean.doDataExport}" value="#{msg.srvExportButton}" /> 
</a4j:form> 

Haupt Bohne:

public String doDataExport() { 

    try { 
     export.downloadFile(); 
    } catch (SurveyException e) { 
     hasErrors = true; 
    } 
    return ""; 
} 

Export-Bohne:

public void downloadFile() throws SurveyException { 

    try { 

     String filename = "analysis.csv"; 

     FacesContext fc = FacesContext.getCurrentInstance(); 
     HttpServletResponse response = (HttpServletResponse) fc.getExternalContext().getResponse(); 

     response.reset(); 
     response.setContentType("text/comma-separated-values"); 
     response.setHeader("Content-Disposition", "attachment; filename=\"" + filename + "\""); 

     OutputStream output = response.getOutputStream(); 

     // writing just sample data 
     List<String> strings = new ArrayList<String>(); 

     strings.add("filename" + ";" + "description" + "\n"); 
     strings.add(filename + ";" + "this is just a test" + "\n"); 

     for (String s : strings) { 
      output.write(s.getBytes()); 
     } 

     output.flush(); 
     output.close(); 

     fc.responseComplete(); 

    } catch (IOException e) { 
     throw new SurveyException("an error occurred"); 
    } 
} 

Edit (05.05.2012 - 16.27)

Ich löste mein Problem. Ich muss <h:commandButton> statt <a4j:commandButton> verwenden und jetzt funktioniert es!

Antwort

4

Benötige ich die Datei zunächst in dem tomcat WEB-INF-Verzeichnis speichern?

Nein, schreiben Sie es einfach direkt auf die HTTP-Antwort Körper, wie Sie durch ExternalContext#getResponseOutputStream() erhalten, nachdem die korrekten Antwort-Header gesetzt zu haben, die den Browser anweist, was es abzurufen geht.

Sind die Mathematik, basierend auf den konkreten Beispielen in den folgenden Antworten gefunden:

Grundsätzlich gilt:

List<List<Object>> csv = createItSomehow(); 
writeCsv(csv, ';', ec.getResponseOutputStream()); 

Übrigens, was ist die favorisierte jsf-Komponente für diese Art von Aufgabe?

Dies ist subjektiv. Aber wir verwenden <p:dataExporter> zur vollen Zufriedenheit.

+0

Ich glaube nicht, dass ich 'PrimeFaces' verwenden kann, weil sie JSF 1.2 seit' PrimeFaces 2.0' nicht unterstützen, wenn ich recht habe? –

+1

Das ist richtig, das alte JSF 1.x ist kurz vor dem Ende des Lebens, also sollten Sie keine neue Unterstützung für Komponentenbibliotheken erwarten. Mach einfach weiter und streame es manuell. Sie müssten nur die rohe 'HttpServletResponse' von' ExternalContext # getResponse() 'holen und dann stattdessen 'getOutputStream()' aufrufen, aber das ist bereits im 1. Link beschrieben. Oder natürlich ein Upgrade auf JSF 2. Es bietet so viele Vorteile gegenüber JSF 1.2. – BalusC

+0

Ich kenne die Nachteile von JSF 1.2, aber im Moment können wir nicht auf ein höheres Level upgraden. Ich habe versucht, deinen ersten Link zu verstehen, aber es funktioniert nicht. Ich habe den MIME-Typ 'text/comma-separated-values' verwendet, den ich im Internet gefunden habe, aber die Browser (IE, FF, Chrome) interpretieren ihn nicht korrekt. –

0

Wenn Sie JSF 2 verwenden, können Sie Oberflächen verwenden.
Sie können sich das link ansehen.

Wenn du es nicht so tun können:

List<Object> report = new ArrayList<Object>(); // fill your arraylist with relevant data 
String filename = "report.csv";  
File file = new File(filename); 
Writer output = new BufferedWriter(new FileWriter(file)); 
output.append("Column1"); 
output.append(","); 
output.append("Column2"); 
output.append("\n"); 
//your data goes here, Replcae Object with your bean 
for (Object row:report){ 
    output.append(row.field1); 
    output.append(","); 
    output.append(row.field2); 
    output.append("\n"); 
} 
output.flush(); 
output.close();