IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Forcer le téléchargement d'une vidéo


Sujet :

Langage PHP

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Juillet 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Forcer le téléchargement d'une vidéo
    bonjour,
    j'ai utilisé ce script pour faire mes amis télécharger ma vidéo à 250 Mo,
    la sortie est des codes n'import quoi, je voudrais savoir s'il y a qq'un peut m'aider, svp

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <?php
    $file = "http://www.mysite.com/video.mpg";
    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);
    exit;
    ?>

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Juin 2007
    Messages
    748
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 748
    Points : 1 022
    Points
    1 022
    Par défaut
    nan , c'est pas ca le problème, je propose un autre, pas sur que ce soit le bon pour toi, mais note les ajouts, et ceux que j'ai enlevé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?php
    $fichier  = trim($_GET['files']);
    $ftp_path = 'cheminversleficher'.$fichier;
    $size = filesize($ftp_path);
    ini_set("memory_limit","500M");
    header("Content-Transfer-Encoding: binary");
    header("Content-Length: $size"); 
    header("Content-Type: application/force-download");
    header("Content-Disposition: attachment; filename=".$fichier);
    ob_clean();
    flush();
    readfile($ftp_path);
    ?>

    grossomodo celui de darkstar123456 +1 est le même, sauf ajouter un peu memoire avec ini_set
    Conception / Dev

  3. #3
    Membre émérite
    Avatar de gene69
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 769
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 769
    Points : 2 446
    Points
    2 446
    Par défaut
    je crois qu'il ne faut pas mettre des entêtes au hasard.
    Content-type doit être utilisé pour indiqué au navigateur le mime du document et donc quel plugin/outil externe il doit utiliser pour ouvrir le doc téléchargé.
    la taille n'est pas obligatoire (mais si tu veux la barre de progression du téléchargement...)
    la disposition permet de savoir seule si c'est pour utilisation immédiate ou pour téléchargement.

    en fait yen a une autre qui peut poser problème avec IE, mais je n'avais eu le probleme que avec des pdf sous ie 6.0 (et qui l'utilise encore?): la compression gzip configurée dans .... php.ini.

    ob_clean/flush... sert a rien si t'es propre dans ton code.

    au pif comme ça, c'est pas terrible parce que si tes droits sont mal réglés tu peux rendre dispo ton fichier de conf de l'appli php avec les mots de passes à la base de donnée dessus... ou pire. ajoute des "/../../" pour t'en convaincre.

    Ce genre de fonctionnalité se réalise toujours avec en utilisant un GUID et une table dans une base qui permet de faire le mapage avec les chemins locaux: tu caches la structure de ton stockage et tu empêches le téléchargement de fichiers arbitraires.
    PHP fait nativement la validation d'adresse électronique .
    Celui qui a inventé mysql_connect(...) or die() est déjà mort plusieurs fois.

    Utilisez le bouton résolu!

  4. #4
    Membre éprouvé

    Profil pro
    Inscrit en
    Juin 2007
    Messages
    748
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 748
    Points : 1 022
    Points
    1 022
    Par défaut
    ob_clean/flush... sert a rien si t'es propre dans ton code.
    moi je te demande de préciser...

    et je pense pas que nous ayons mis des des entêtes au hasard.
    Conception / Dev

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Juillet 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par ascito Voir le message
    nan , c'est pas ca le problème, je propose un autre, pas sur que ce soit le bon pour toi, mais note les ajouts, et ceux que j'ai enlevé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?php
    $fichier  = trim($_GET['files']);
    $ftp_path = 'cheminversleficher'.$fichier;
    $size = filesize($ftp_path);
    ini_set("memory_limit","500M");
    header("Content-Transfer-Encoding: binary");
    header("Content-Length: $size"); 
    header("Content-Type: application/force-download");
    header("Content-Disposition: attachment; filename=".$fichier);
    ob_clean();
    flush();
    readfile($ftp_path);
    ?>

    grossomodo celui de darkstar123456 +1 est le même, sauf ajouter un peu memoire avec ini_set
    bonjour,
    merci de votre réponse, mais ça marche pas, lorsque je teste votre script php, IE a téléchargé votre script même, puis j'ai mis un lien avec html, il a affiché des millions des codes, voici ce que j'ai fait
    <p><A href="http://www.mysite.com/teste-a.php" target="_blank"> veuillez cliquer pour télécharger </A></p>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    <?php 
    $fichier  = trim($_GET['cuisine.mpg']);
    $ftp_path = 'http://www.mysite.com/cuisine.mpg'.$fichier;
    $size = filesize($ftp_path);
    ini_set("memory_limit","500M");
    header("Content-Transfer-Encoding: binary");
    header("Content-Length: $size"); 
    header("Content-Type: application/force-download");
    header("Content-Disposition: attachment; filename=".$fichier);
    ob_clean();
    flush();
    readfile($ftp_path);
    ?>

  6. #6
    Membre émérite
    Avatar de gene69
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 769
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 769
    Points : 2 446
    Points
    2 446
    Par défaut
    @ascito, à quoi ça sert?

    l'appel à ob_clean() est là parce qu'il y a un ob_start() avant, non ? dans ce cas là la sortie antérieure est perdue... c'est une bonne chose parce que évite de pourir le fichier que l'on va envoyer avec par example une notice/warning sauvage de php. Mais le tempon reste actif (cf manuel) et dans ce cas tu ne peux rien écrire directement sur le flux de sortie après l'instruction.

    Forcement, maintenant que tu as effacé ton tampon de sortie avec le ob_clean() tu n'executes pas des ob_flush() qui serait inutile, mais un flush() qui écrit tout vers le navigateur, sans se soucier des mécanismes de buffers qui sont là pour la performance.

    Heureusement pour toi, tu dois écrire 3 entêtes avec le flush() et rien de plus (j'imagine que ça doit changer le résultat de header_send() et c'est tout ), parce qu'au contraire tu corromprerais le fichier que tu veux proposer au téléchargement. A mon avis ton code fonctionne donc tu n'as pas eu ce problème, donc flush() ne sert à rien.

    Mais en fait il n'y avait pas de tampon du tout! parce qu'au contraire readfile($ftp_path) aurait tout envoyer au tampon. Donc ob_clean() ne sert à rien.

    Citation Envoyé par ascito
    et je pense pas que nous ayons mis des des entêtes au hasard.
    A moins qu'il y ait des mécanismes cachés dans ton code... mais dans ce cas c'est pas très didactique de le proposer en exemple.

    Enfin tu aurais vraiment voulu te débarasser du tampon de sortie, tu aurais fait comme moi dans ma classe débug:
    (pub)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    static public function kill(){
      //....
      while( ob_get_level() > 1 ){
         echo '<!-- new Buffer -->', ob_get_clean(); //ici un ob_end_clean() si pas d'affichage;
      }
     
      //...
      exit;
    }
    PHP fait nativement la validation d'adresse électronique .
    Celui qui a inventé mysql_connect(...) or die() est déjà mort plusieurs fois.

    Utilisez le bouton résolu!

  7. #7
    Membre émérite
    Avatar de gene69
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 769
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 769
    Points : 2 446
    Points
    2 446
    Par défaut
    Citation Envoyé par terrenuit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ftp_path = 'http://www.mysite.com/cuisine.mpg'.$fichier;
    //...
    $size = filesize($ftp_path);
    //...
    readfile($ftp_path);
    nan ! faut donner des chemin locaux à filesize() & consort, et comme on a souvent deux environnements __DIR__ (php5.3) est très utile.

    Question subsidiaire: $ftp_path <=> http:// ?!?
    PHP fait nativement la validation d'adresse électronique .
    Celui qui a inventé mysql_connect(...) or die() est déjà mort plusieurs fois.

    Utilisez le bouton résolu!

  8. #8
    Nouveau Candidat au Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Juillet 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par gene69 Voir le message
    nan ! faut donner des chemin locaux à filesize() & consort, et comme on a souvent deux environnements __DIR__ (php5.3) est très utile.

    Question subsidiaire: $ftp_path <=> http:// ?!?
    bonjour,
    je suis nouveaux sur le PHP,
    je comprend pas trop le chemin locaux à filesize.... c'est quoi ?
    j'ai modifié mon script php:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?php 
    $fichier  = trim($_GET['cuisine.mpg']);
    $ftp_path = 'mysite.com/'.$fichier;
    $size = filesize($ftp_path);
    ini_set("memory_limit","500M");
    header("Content-Transfer-Encoding: binary");
    header("Content-Length: $size"); 
    header("Content-Type: application/force-download");
    header("Content-Disposition: attachment; filename=".$fichier);
    ob_clean();
    flush();
    readfile($ftp_path);
    ?>
    et le HTML:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <p><A href="http://www.mysite.com/teste-a.php" target="_blank"> veuillez cliquer pour télécharger </A></p>
    après avoir cliquer "veuillez cliquer pour télécharger", il affiche aussi : veuillez cliquer pour télécharger,
    j'aimerais savoir comment faire afficher la fênetre de téléchargement ?
    mon URL:http://www.mysite.com
    nom de fichier dans le serveur:cuisine.mpg est une vidéo à 250Mo

  9. #9
    Candidat au Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2009
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2009
    Messages : 2
    Points : 3
    Points
    3
    Par défaut Forcer le téléchargement d'une vidéo : ressources serveur
    Bonjour,

    Dans le cas de ces scripts qui utilisent la fonction php readfile(), est-ce que les ressources du serveur (php + web) utilisées sont beaucoup plus grandes que lors d'un lien direct sur le fichier géré par Apache (web seul) ?

    Merci

  10. #10
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Points : 2 440
    Points
    2 440
    Par défaut
    La réponse à la question est dans la réponse: php + apache ou apache seul?

    readfile répond à d'autres problématiques (contrôle d'accès, modification préalable du fichier, forcer un téléchargement, etc ...)

Discussions similaires

  1. Réponses: 1
    Dernier message: 09/09/2014, 20h11
  2. Forcer le téléchargement d'une page web
    Par max_60 dans le forum Langage
    Réponses: 4
    Dernier message: 14/10/2008, 10h48
  3. forcer le téléchargement d'une image jpg
    Par koKoTis dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 29/09/2008, 09h49
  4. forcer le téléchargement d'une image
    Par pierrot10 dans le forum Débuter
    Réponses: 1
    Dernier message: 12/07/2008, 15h01
  5. [PHP-JS] Forcer le téléchargement d'une image JPG
    Par Amnesiak dans le forum Langage
    Réponses: 5
    Dernier message: 09/11/2006, 23h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo