2014-09-14 2 views
0

RESOLU, en raison d'un problème connu lié au bootstrap (Nesting <a> inside <button> doesn't work in Firefox).Le fichier de téléchargement Php ne fonctionne pas avec Firefox

J'essaye de forcer simplement le téléchargement d'un fichier et cela fonctionne très bien sur Chrome & Safari, mais pas sur Firefox.

J'ai download.php télécharger déposer mon dossier (utilisé dans un "a href"):

<?php 

$filename="myFile.pdf"; 
$file="../content/$filename"; 
$len = filesize($file); // Calculate File Size 
if (ob_get_contents()) ob_end_clean(); 
header("Pragma: public"); 
header("Expires: 0"); 
header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
header("Content-Description: File Transfer"); 
header("Content-Type:application/pdf"); // Send type of file 
$header="Content-Disposition: attachment; filename=$filename;"; // Send File Name 
header($header); 
header("Content-Transfer-Encoding: binary"); 
header("Content-Length: ".$len); // Send File Size 
@readfile($file); 
exit; 

?> 

Il est utilisé avec:

<a class="myFileClass" href="download.php">Download</a> 

donc avec Chrome & Safari, lorsque Je clique sur le lien de téléchargement, le fichier est téléchargé! Mais avec Firefox, rien ne se passe.

Une idée de ce problème curieux?

Merci d'avance.

+1

Si vous obtenez juste le mauvais nom de Firefox, vous devriez regarder dans les outils de développement. L'onglet Réseau affiche la demande et la réponse pour le PDF afin que vous puissiez voir s'il y a des erreurs. – Quentin

+0

Désolé pour le malentendu, j'utilise Mozilla Firexfox v32.0.1 – Rhyzko

+1

Pourquoi définissez-vous l'en-tête 'Cache-Control' deux fois? Le second remplacera le premier. –

Répondre

3
$header="Content-Disposition: attachment; filename=$filename;"; 

Ceci est faux, veuillez utiliser des guillemets pour le nom de fichier. Il devrait être comme ci-dessous

header('Content-Disposition: attachment; filename="' . basename($file).'"'); 

code Exemple

header('Content-Description: File Transfer'); 
    header('Content-Type: application/octet-stream'); 
    header('Content-Disposition: attachment; filename="' . basename($file).'"'); 
    header('Content-Transfer-Encoding: binary'); 
    header('Expires: 0'); 
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
    header('Pragma: public'); 
    header('Content-Length: ' . filesize($file)); 
    ob_clean(); 
    flush(); 

    readfile($file); 
-2

L'exemple ci-dessus en référence basename etc. télécharge un fichier vide.

Le code ci-dessous renvoie des données avec des données html également incluses dans l'appel Wordpress pour la sortie, mais ne nettoient les données qu'en dehors de Wordpress.

les deux codes produit uniquement un appel de téléchargement dans IE.

$filename = $db_record.'_'.date('Y-m-d').'.csv'; 
header('Pragma: public'); 
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the Past 
header('Expires: 0'); 
header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
header('Cache-Control: private', false); 
header('Content-Type: text/csv'); 
header('Content-Disposition: attachment; filename='. $filename); 
Readfile($filename); 
Questions connexes