2011-03-01 12 views
7

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!

+3

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

+0

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

+0

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

Respuesta

4

Ok todo este tiempo fue un problema de espacio. Mi nombre de archivo era "nombre de archivo.csv" y esto funciona en todos los navegadores excepto en firefox. Tan pronto como puse mi nombre de 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.

En el futuro asegúrese de que el nombre del archivo tiene una comilla alrededor de él en la cabecera. Esto permitirá que Firefox para descargar correctamente (sin despojarse de algo más allá del espacio) si necesita un espacio de nombre de archivo.

Buena suerte!

+1

Alguien viene a este problema ahora : ver http://kb.mozillazine.org/Filenames_with_spaces_are_truncated_upon_download. El verdadero problema es que debes tener Content-Disposition: attachment; filename = "nombre de archivo con espacios". –

+0

@ El comentario de NateBundy es correcto. Tiene comillas dobles de escape alrededor del nombre del archivo si su encabezado está en una cadena con comillas dobles. –

+0

gracias por la publicación, ayudó a resolver un problema con firefox [aquí] (http://stackoverflow.com/a/32373057/2218697) es la solución – stom

1

Añadir el encabezado de tipo de contenido con valor de texto/csv

response.setHeader("Content-type: text/x-csv"); 
+2

'text/csv' también debería ser suficiente. –

+0

No funciona. La misma cosa. Firefox lo ve como un nombre de archivo sin extensión. Si agrego application/vnd.ms-excel como el tipo de contenido, lo ve como un archivo excel (xlsx) aunque es un archivo .csv. –

0

no soy experto en Java/JSP pero ¿estás seguro de que esto es correcto para el texto/csv?
response.setHeader ("Content-Transfer- Codificación "," binario ");
¿Intentó comentar esto? En PHP simplemente haré eco/imprimir el archivo CSV precedido con encabezados de tipo de contenido encabezado y disposición tipo.

2

El contenido de tipo de texto/csv es correcta, pero también se debe añadir una codificación charset:

response.setHeader("Content-type: text/csv; charset=utf-8"); 

Pero qué demonios es esto:

response.setHeader("Content-Transfer-Encoding", "binary"); 
response.setHeader("Content-length", String.valueOf(stringList.size())); 

eliminar ese cabeceras! La longitud del contenido está en bytes. No trates de calcularlo por ti mismo. ¡Definitivamente es incorrecto en este ejemplo! Un Mime-Type con el tipo principal text no es binario.

+0

Todavía no funciona. Firefox sigue quitando el csv del final. IE8 funciona en este caso. Si cambio el tipo de contenido a la aplicación .xls/sobresalir aplicación de .xls/vnd.ms-excel aplicación de .xls/x-excel aplicación de .xls/x-msexcel se pone xls o xlsx en el fin. –

+0

Por favor, [verifique esto] (http://stackoverflow.com/questions/39848019/why-php-script-does-not-generate-csv-file-in-firefox/39848402) Necesito ayuda –

6

Tuve el mismo problema en PHP y encontré que agregar comillas dobles para el nombre del archivo corrige el problema

response.setHeader("Content-disposition", "attachment; filename=\"" + fileName + \""); 
0

Response.AddHeader ("content-disposition", cadena.Format ("attachment; filename = \" {0} \ "", fileName)); Response.ContentType = "text/csv; charset = utf-8";

Cuestiones relacionadas