2016-06-02 9 views
1

Problem: Der Inhalt einer CSV-Datei wird als Seiteninhalt angezeigt, wenn die Anzahl der Datensätze groß ist.Der Inhalt der CSV-Datei wird auf der Webseite angezeigt, anstelle eines korrekten Dateidownloads

Erwartet: Dateidownload.

Die Anfrage wird von einer anderen Seite über window.open (url) ausgelöst; Folgendes ist der URL-Handler.

@RequestMapping(value = "/url", method = RequestMethod.GET) 
public void handler(HttpServletRequest request,ModelMap map, @RequestParam("itemPk") long pk, HttpServletResponse response) throws Exception { 
    CSVWriter csvWriter = new CSVWriter(new OutputStreamWriter(response.getOutputStream())); 
    try { 
     List<String[]> data = new ArrayList<String[]>(); 
     for (int i = 0; i < 500; i++) { 
      String[] row = new String[] {"asdr", "10", "sourajit", "34.567", "06-DEC-2015", "awx445"}; 
      data.add(row); 
     } 
     csvWriter.writeAll(data); 

     response.setContentType("text/csv"); 
     response.setHeader("Content-disposition", "attachment; filename=volcs.csv"); 


    } finally { 
     csvWriter.flush(); 
     csvWriter.close(); 
    } 
} 

gleiches Verhalten für GET oder POST. (Für POST, Öffnen eines neuen Fensters mit einem HTML-Formular)

Antwort

0

Dies ist, weil eine Writer-Instanz zum Generieren der Antwort verwendet wird.

Wir müssen es als Bytes behandeln.

ServletOutputStream out = response.getOutputStream(); 
out.write(baos.toByteArray()); 
baos.writeTo(out); 
out.flush(); 
0

Sie müssen Header hinzufügen, um dem Browser mitzuteilen, dass der Anhang in der Antwort enthalten ist. Überprüfen Sie das unten!

response.setContentType ("application/force-download"); response.setContentLength ((int) f.length()); //antwort.setContentLength(-1); response.setHeader ("Content-Transfer-Encoding", "binary"); response.setHeader ("Content-Disposition", "Anhang; Dateiname = \" "+ " xxx \ ""); // fileName); ...

Verwandte Themen