2010-08-29 25 views
2

J'ai un site avec des fichiers audio dans une base de données mySQL, qui sont tous disponibles pour la lecture. Cela fonctionne très bien en utilisant les en-têtes:Récupérer mp3 à partir de mySQL et forcer le téléchargement au lieu de la lecture dans le navigateur

header("Content-length:". $audioLength); 
header("Content-type: ". $audioMime); 


echo $audio; 

Lorsque le audioLength $ et audioMime $ sont stockés avec le fichier dans la base de données et audio $ sont les données réelles. Je veux maintenant ajouter des liens de téléchargement pour certains des fichiers plus volumineux, il serait donc très évident pour les utilisateurs qui ne savent pas comment télécharger un mp3 à partir d'une page qu'ils sont invités à le faire et mettre la musique sur leurs appareils et les partager de toute autre manière qu'ils aiment. Mon PHP est le même sauf que je remplacé les en-têtes avec:

header("Content-type: attachment/octet-stream"); 
header("Content-disposition: attachment; filename=" . $fileName); 

echo $audio; 

Cela provoque encore Safari et Firefox pour jouer l'audio, mais uniquement dans une nouvelle fenêtre. Comment forcer une boîte de dialogue de téléchargement? Je suppose que la plupart des autres navigateurs là-bas serait jouer le fichier aussi bien, donc je ne l'ai pas testé les ... encore

M

OK - Je suis un idiot !!! dynamitage J'ai créé le fichier PHP qui serait téléchargé au lieu de lire à partir du fichier qui joue. Et j'ai oublié de modifier la référence au nouveau fichier PHP dans l'URL des fichiers que je récupérais. Brillant. Je l'ai eu le premier essai, il ne fonctionnait tout simplement pas parce que j'appelais le faux fichier.

Ainsi, pour toutes les personnes là-bas avec cette question - c'est ce qui fonctionne:

header('Content-Type: '.$audioMime); 
header("Content-disposition: attachment; filename=" . $fileName); 

echo $audio; 

Ta-da! Allez-y, riez-moi et donnez-moi l'insigne du jour idiot. Je le mérite.

M

Répondre

1

Au lieu de header("Content-type: attachment/octet-stream");, essayez d'utiliser header('Content-Type: application/octet-stream');.

Vous pouvez également ajouter l'en-tête suivant:

header ("Cache-Control: must-revalidate, post-check=0, pre-check=0");

+0

Donc, maintenant il ressemble à ceci: header ('Content-Type: application/octet-stream'); header ("Content-disposition: pièce jointe; nomfichier =". $ NomFichier); header ("Cache-Control: doit-revalider, post-vérifier = 0, pré-vérifier = 0"); echo $ audio; et joue encore au lieu de télécharger ... –

+0

Le contrôle du cache ne devrait avoir aucun effet (lors de tests de ce type, bien sûr, vous devriez effacer le cache avant de réessayer) –

0

1) ne pas envoyer un autre type de contenu. 2) la syntaxe sans guillemets ne fonctionne que si un nom de fichier est un jeton (tel que défini dans MIME), par exemple, il ne peut pas contenir d'espaces.

En cas de doute, installez LiveHTTPHeaders dans Firefox et publiez ce que vous voyez sur le réseau.

+0

OK - J'ai changé le type de contenu. J'ai posté une réponse à votre réponse dans le corps des questions car il n'y a pas assez de caractères autorisés ici ... –

+0

Vous pouvez ajouter plus de caractères en citant le nom du fichier.Vous pouvez ajouter encore plus en utilisant l'encodage défini dans RFC 2231 et 5987 (mais cela n'est pas supporté dans IE/Safari/Chrome). –