Forcer le téléchargement avec PHP ensuite rediriger
Je sais que cette question a été posée de nombreuses fois avant, mais je ne peux pas trouver une réponse en fonction de mes besoins.
J'ai besoin de trouver un moyen de forcer le téléchargement d'un fichier et ensuite, une fois le téléchargement commencé, rediriger vers un "merci pour le téléchargement de la page".
Pour l'instant j'ai:
<?php
ob_start();
$token = $_POST['validationCode'];
if(isset($token)){
$connect = mysql_connect('localhost', 'root', 'root');
$db = mysql_select_db('mydb');
if (!$connect || !$db){
die('Connect Error (' . mysql_connect_errno() . ') '
. mysql_connect_error());
}
$sql = mysql_query("SELECT * FROM emailaddresses WHERE token='$token'");
$result = mysql_fetch_array($sql);
if($result){
header('Location: complete.php');
header('Content-type: application/mp3');
header('Content-Disposition: attachment; filename=track.mp3');
$f = file_get_contents('downloads/track.mp3');
print $f;
$sql = "UPDATE emailaddresses SET download=1 WHERE token='$token'";
$result = mysql_query($sql);
}
else{
echo "There was a problem downloading the file" . mysql_error();
}
}
ob_end_flush();
?>
Il est important de cacher le téléchargement du fichier emplacement sinon, je viens de créer un lien HTML vers le fichier.
Évidemment je ne peux pas mettre une redirection en-tête ci-dessous les autres en-têtes comme il juste ne fonctionnera pas. Je ne vois pas vraiment où aller à partir d'ici en dehors de l'ouverture de ce dans une fenêtre pop-up et la direction de la fenêtre principale de la page "merci" - mais c'est un DERNIER recours.
Quelqu'un peut-il donner des suggestions?
Acclamations,
Riche
OriginalL'auteur RichieAHB | 2011-04-07
Vous devez vous connecter pour publier un commentaire.
Il n'y a vraiment pas beaucoup de choix. Si votre principal objectif est de masquer l'URL, c'est une cause perdue de toute façon. Pour une bonne utilisation, vous comprennent généralement la plaine lien sur la page de toute façon ("Téléchargement ne démarre pas? Cliquez sur ici..."), puisque l'utilisateur peut accidentellement annuler la redirection juste au mauvais moment irrévocablement tuer le téléchargement.
Vous ne pouvez pas afficher quoi que ce soit d'autre que le fichier lui-même dans la même requête/réponse. Vous pouvez essayer de partie multi-réponses HTTP, comme suggéré par @netcoder, mais je ne suis pas vraiment sûr de savoir comment bien pris en charge. Simplement de commencer avec l'hypothèse qu'il y a un "gaspillage" de requête/réponse dans laquelle seul le fichier est téléchargé et rien ne se passe. La façon dont les choses fonctionnent habituellement avec cette restriction est comme ceci:
<meta>
actualiser ou HTTPRefresh
en-tête qui provoque un retardé rediriger vers l'URL du fichier.Regarder http://download.com pour un exemple de cette action dans le.
Vous pouvez faire à l'emplacement de téléchargement pour le fichier est un script qui retourne uniquement le fichier si l'utilisateur est autorisé à télécharger le fichier. Vous pouvez passer un certain jeton temporaire entre le "Merci" page et la page de téléchargement de fichiers pour vérifier que le téléchargement est autorisé.
Ensuite, vous avez besoin réel de validation pour le téléchargement de fichier lui-même. Comme vous le dites, le mettre à l'extérieur de la racine du site, fournir l'accès par l'intermédiaire d'un script et laissez que le script vérifie si l'utilisateur est censé y accéder ou pas. La redirection après-télécharger des stands, vous devez le faire avec du Javascript côté client.
Mon problème est l'écho de quelque chose - dans ce cas, le javascript sur une page où l'en-tête décrit le type de contenu comme une application et vous ne pouvez donc pas d'écho avant l'en-tête ou après, avec ou sans le tampon de sortie. Je suis un total noob à ce que je suis sans doute faire une erreur fondamentale dans mes hypothèses, mais je ne peux pas travailler. Merci pour votre aide jusqu'à présent - je suis sûr que je vais travailler dans le froid lumière du jour, de demain avec ces réponses 🙂
Voir mise à jour.
Cela sonne comme le billet, merci! J'ai eu une couple de fois, tandis que bricoler avec des en-têtes - où le fichier se télécharge, mais il est resté sur la validation de la saisie de la page plutôt que visiblement se déplacer sur une page de téléchargement. Je n'ai jamais pensé à l'utiliser qu'une étape vers le bas de la ligne à la page de remerciement. Je suis sûr que ça va prendre un peu de jongler, mais je sens que je vais avoir un tri. Merci!
OriginalL'auteur deceze
Le seul moyen en PHP je sais (pour avoir un téléchargement, puis rediriger) est d'utiliser un multi-partie de la réponse HTTP. Quelque chose comme ça:
Dans votre cas, vous avez juste à la sortie de "Merci pour le téléchargement de" contenu de la page à la place de la redirection JavaScript.
Je ne suis pas sûr de savoir si cela fonctionne sur tous les principaux navigateurs ou pas.
Pourquoi ne pas l'apprendre? Il n'est pas difficile. Si vous savez comment gérer les en-têtes et le contenu, alors vous savez comment traiter une partie multi-réponses. Je viens de faire un exemple. Essayez-la. 🙂
Content d'avoir pu aider!
Ne fonctionne pas sur chrome
OriginalL'auteur netcoder
Ok, la première chose d'abord, le navigateur besoin de connaître l'emplacement du fichier pour le télécharger. Toute ouverture d'un navigateur standard dev outil comme Firebug sera en mesure de voir dans la plaine du texte de l'URL de votre fichier.
Maintenant, je suppose que vous voulez protéger vos fichiers contre tout télécharger. Si c'est ce que vous voulez, il y a un moyen pour que l'utilisation de session.
Sur la première page, vous allez mettre votre code pour vérifier si le téléchargement est autorisé. Vous serez alors mis en séance de courant de quelque chose que d'identifier le fichier. Tout ce qui est unique pour le fichier, comme l'id de base de données.
Ensuite, vous rediriger vers une page avec html, meta, comme ce
Ceci est la page où vous pourrez vous dire "Merci amende garçon pour le téléchargement de mon génial fichier". Notez que vous pouvez également mettre le contenu de l'attribut "content" dans un fichier d'en-tête si vous le souhaitez, à l'instar de ce
Noter que le 5 est le nombre de seconde jusqu'à ce que le téléchargement de fichier boîte de dialogue apparaît.
Puis sur download.php vous effectuerez les opérations suivantes :
1 - Vérifier le fichier demandé l'aide de l' $_GET['fichier'].
2 - Ensuite, vous vérifiez si le download_key existe dans la session. Si non, vous quittez le script comme ça
3 - Puis vous vérifiez si le timestamp est plus vieux que certains arbitraire limite de temps. Ici avec 30 sec
4 - Enfin, si tous les découvrez, vous envoyez le fichier comme ça
Après le readfile, vous allez mettre le code de la télécharger à 1 dans la base de données.
Et ça y est, protégé de téléchargement de fichier, et toute personne utilisant directement l'URL seront accueillis par un grand "non autorisée" de texte.
Je tiens également à ajouter que si vous avez un fichier de grande taille (plus de dire quelques kilo-octets), vous pourriez être mieux de le désactiver le tampon de sortie, car cela signifie que php va garder une copie du fichier dans la mémoire pour toute la durée du téléchargement. Avec la fonction readfile, php va l'envoyer au navigateur, comme il le lire sur le disque, et donc d'utiliser moins de mémoire (et va commencer à envoyer des données plus tôt).
EDIT : Ce qui est le suivant
J'ai effectivement inversé la séquence : le visiteur est tout d'abord redirigé vers la page de remerciement qui contiennent une Actualisation en-tête/tag. La magie de l'Actualisation de l'en-tête, c'est qu'il rediriger APRÈS que le contenu est chargé. Une fois sur la page de remerciement, le navigateur de voir que l'en-tête, puis d'attendre le temps indiqué tout en montrant la page, puis de redirection pour le téléchargement. Une fois redirigé, le navigateur de voir que c'est un fichier à télécharger et plutôt que de modifier la page, il suffit de montrer le téléchargement de fichier boîte de dialogue. Une fois que l'utilisateur clique sur OK, le téléchargement va commencer, mais il restera sur la même page.
En un mot, vous n'avez pas besoin de rediriger une fois le fichier télécharger, puisque vous êtes déjà sur la page de remerciement! Je ne pense pas qu'il est même possible de rediriger après un téléchargement de fichier. Il suffit de regarder ce qui se passe quand vous cliquez sur un lien qui pointe vers un fichier directement sur le serveur. Le navigateur invite à télécharger, mais ne coupez pas votre navigation. Une fois que le téléchargement est lancé, vous pouvez heureusement clic de souris à partir de la page avec le lien. Par le temps que le téléchargement est terminé, vous pouvez être sur un tout autre Site web. C'est pourquoi vous ne pouvez afficher la page de remerciement avant. Mais si vous mettez un zéro pour l'actualisation de l'en-tête/tag, l'invite de téléchargement apparaîtra dès que la page est chargée, donc c'est presque comme si les deux étaient simultanées (l'œil du visiteur)
J'ai essayé d'ajouter un peu plus de détails dans la réponse. Juste me dire si il y a encore quelques flous points.
Merci Laurent, c'est exactement la façon dont je suis allé avec maintenant. Le faire en sens inverse et juste arriver le scrip pour modifier l'en-tête plutôt que de la page réelle. Et merci pour l'astuce sur les ob-rincer avec de gros fichiers - n'avait pas pensé à cela!
OriginalL'auteur Laurent Bourgault-Roy