He intentado todo lo que puedo pensar. He cambiado el tipo de mimo 100 veces. Cambió los encabezados 400 veces. He revisado la pila sobre el flujo una docena de veces. Esto funciona bien en Chrome. Tan pronto como vaya a descargarlo en Firefox, creo que es un archivo xlsx o un archivo binario. Incluso se abre como un xlsx pero no cree que sea un csv, por lo que las columnas no están separadas. Si guardo el archivo (en lugar de solo presionar abrir) ni siquiera pone la extensión. Ni siquiera llegué al IE todavía, así que esto es algo que me preocupa.Firefox no descargará este archivo como CSV
mime mapping
<mime-mapping>
<extension>csv</extension>
<mime-type>application/vnd.ms-excel</mime-type>
</mime-mapping>
He tratado de texto/csv, application/csv, la aplicación/binario, application/octet-stream.
public void doDownloadFile() {
PrintWriter out = null;
try {
String fileName = selectedPkgLine.getShortname() + ".csv";
HttpServletResponse response = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
response.setHeader("Pragma", "public");
response.setHeader("Expires", "0");
response.setContentType(request.getServletContext().getMimeType(fileName));
response.setHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0");
response.setHeader("Content-disposition", "attachment; filename=" + fileName + "");
response.setHeader("Content-Transfer-Encoding", "binary");
out = response.getWriter();
CSVWriter writer = new CSVWriter(out);
List<PkgLoad> pkgLoadList = pkgLoadService.findBetweenDates(selectedPkgLine, startDate, endDate);
List<String[]> stringList = new ArrayList<String[]>();
stringList.clear();
String[] header = {
"pkg_load_id",
"time_stamp",
"ounces",
"revolutions",
"wrap_spec_id",
"pkg_line_id"
};
stringList.add(header);
for (PkgLoad pkgLoad : pkgLoadList) {
String[] string = {
pkgLoad.getPkgLoadId().toString(),
pkgLoad.getTimeStamp().toString(),
pkgLoad.getOunces().toString(),
pkgLoad.getRevolutions().toString(),
pkgLoad.getWrapSpecId().getWrapSpecId().toString(),
pkgLoad.getPkgLineId().getPkgLineId().toString()
};
stringList.add(string);
}
response.setHeader("Content-length", String.valueOf(stringList.size()));
writer.writeAll(stringList);
out.flush();
} catch (IOException ex) {
Logger.getLogger(ViewLines.class.getName()).log(Level.SEVERE, null, ex);
} finally {
out.close();
}
}
Gracias por cualquier ayuda.
Safari, Opera y Chrome funcionan bien. No he intentado IE.
**** **** EDITAR
Ok todo este tiempo que era una cuestión espaciado. Mi nombre de archivo era "nombre de archivo.csv" y esto funciona en todos los navegadores excepto en firefox. Tan pronto como puse el nombre de mi archivo en "filename.csv sin espacios, lo descargué, encontré. No noté que cuando estaba descargando solo estaba descargando la primera parte del nombre antes del espacio. ¡Buena suerte!
Deberías probarlo con IE y ver qué resultado obtienes. Quizás eso te diga más sobre el problema que tienes con Firefox. – AudioDroid
Tenga en cuenta que el '' solo se utiliza cuando el recurso se ha servido desde un contenido web público mediante un enlace/llamada directa o cuando utiliza 'ServletContext # getMimeType()'. Es irrelevante en este propósito particular cuando usted sirve la respuesta y configura el encabezado 'Content-Type' usted mismo. –
BalusC
Sí, lo entiendo. Solo estaba intentando todo lo que podía hacer. Este código en particular funciona en IE8. Lo ve como un csv y puedo guardarlo y abrirlo. No sé lo que está mal con Firefox. –