2012-06-06 10 views
7

Me gustaría generar un archivo csv con datos, que obtengo al consultar una base de datos. El navegador luego debe solicitar al usuario que descargue el archivo. El problema es que la función readfile necesita un nombre de archivo y no un identificador, pero no puedo encontrar una función para obtener el nombre de archivo de este archivo temporal. Supongo que hay mejores formas de hacerlo, pero no puedo encontrarlas.¿Cómo exportar un archivo csv temporal generado dinámicamente?

$handle = tmpfile(); 
fputcsv($handle, array('year', 'month', 'product', 'count')); 
header('Content-Type: application/csv'); 
header('Content-Disposition:attachment;filename=LS_export'); 
echo readfile($handle); 
fclose($handle); 
exit(); 
+0

está usando MySQL? –

+0

sí @khaled_webdev – Riesling

+0

puede generar el archivo directamente desde una consulta de mysql –

Respuesta

13

Usted está buscando rewind para restablecer el puntero del archivo al principio del archivo, seguido de fpassthru para dar salida a todos los contenidos del archivo.

rewind($handle); 
fpassthru($handle); 

Otra solución es utilizar tempnam para generar un archivo único que no se elimina cuando se cierra. No olvides eliminarlo manualmente cuando hayas terminado con él.

$name = tempnam('/tmp', 'csv'); 
$handle = fopen($name, 'w'); 
... 
fclose($handle); 
readfile($name); 
unlink($name); 
+0

eso es lo que estaba buscando, funciona como un encanto, gracias – Riesling

2

Uso

$tmpfname = tempnam("/", ""); 
$handle = fopen($tmpfname, "w"); 
... 
fclose($handle); 

Y tiene el nombre del archivo también.

+0

No se olvide de eliminar el archivo después. Pero la solución de Emil parece mejor. – Zoka

0

de MySQL

SELECT id, name, email INTO OUTFILE '/tmp/result.csv' 
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' 
ESCAPED BY ‘\\’ 
LINES TERMINATED BY '\n' 
FROM users WHERE 1 

y eliminarlo de la demanda

separadores redefinir y otro parámetro que necesite

Cuestiones relacionadas