Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

163
Visualizações
El sitio web de php muestra el archivo en lugar de descargarlo

Estoy ejecutando un sitio web de php 8 en el servicio de aplicaciones web de Linux en Azure. Cuando el usuario presiona un botón, quiero crear un archivo sobre la marcha (leer datos de db) y descargarlo. En cambio, está mostrando contenido en la página. Aquí está el código

 header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Type: text/csv; charset=utf-8'); header("Content-Disposition: attachment; filename=geodata.csv"); header('Expires: 0'); header('Cache-Control: must-revalidate'); header('Pragma: public'); header('Content-Length: ' . filesize("geodata.csv")); $file = fopen('php://output', 'w') or die ("Unable to create file in write mode"); if (ob_get_contents()) ob_end_clean(); fputcsv($output, array('name','loc','zip'), chr(6)); $mrows = mysqli_query($myconnection, "SELECT name,loc,zip FROM geo_tbl WHERE sp = 'FL'"); while ($mrow = mysqli_fetch_assoc($mrows)) { fputcsv($file, $mrow, chr(6)); } fclose($file); readfile("geodata.csv"); exit();

Gracias

over 4 years ago · Santiago Trujillo
3 Respostas
Responde à pergunta

0

Veo varios problemas con el código:

  1. Como ya señaló Alan, tiene encabezados Content-Type duplicados. Si está guardando el archivo como un archivo adjunto, realmente puede usar cualquiera de los dos.

  2. Emite su mensaje de die después de haber configurado el encabezado Content-Type para un archivo csv para que el mensaje no se muestre correctamente. Por lo tanto, debe hacer la instrucción fopen antes de configurar el encabezado del contenido.

  3. Está enviando parte de su salida a la variable $output en lugar de $file con la instrucción fputcsv($output, array('name','loc','zip'), chr(6)); y esa variable no parece estar definida.

  4. Está configurando un encabezado Content-Length con header('Content-Length: ' . filesize("geodata.csv")); pero en este punto no tienes idea de cuál es la longitud del contenido.

  5. Debe poner comillas dobles alrededor de su nombre de archivo en el encabezado Content-Disposition .

Aunque no son errores, en sí , está recuperando las filas con fetch_assoc , por lo que $mrow contendrá claves y valores. Realmente solo necesitas usar fetch_row . También cuestiono su uso de chr(6) , que es un carácter ACK, como delimitador de columna. ¿Posiblemente quiso decir chr(9) , una TAB?

Creo que lo siguiente es todo lo que necesitas:

 <?php //define (DELIMITER, chr(9)); // Shouldn't it be this? define (DELIMITER, chr(6)); if (ob_get_contents()) { ob_end_clean(); } $file = fopen('php://output', 'w') or die ("Unable to create file in write mode"); header('Content-Type: text/csv'); header('Content-Disposition: attachment; filename="geodata.csv"'); header('Pragma: no-cache'); header('Expires: 0'); fputcsv($file, array('name','loc','zip'), DELIMITER); $mrows = mysqli_query($myconnection, "SELECT name,loc,zip FROM geo_tbl WHERE sp = 'FL'"); while ($mrow = mysqli_fetch_row($mrows)) { fputcsv($file, $mrow, DELIMITER); } fclose($file);
over 4 years ago · Santiago Trujillo Relatório

0

Cuando el usuario presiona un botón

Simplemente agregue el atributo de descarga a su botón, debería funcionar de inmediato.

 <a href="link/to/your/file.csv" download="filename.csv">Download link</a>

https://developer.mozilla.org/en-US/docs/Web/HTML/Element/a#attr-download

over 4 years ago · Santiago Trujillo Relatório

0

Como han dicho otros, hay varios problemas con su código.

Pero si simplemente elimina el segundo encabezado de tipo de contenido y lo mantiene como application/octet-stream , esto debería forzar una descarga.

Sin embargo, la longitud de su contenido no se informará correctamente. Quizás lea el contenido en una variable, luego tome la longitud de esa cadena como el encabezado content-length .

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda