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 :

Téléchargement de fichier sous php


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 99
    Points : 55
    Points
    55
    Par défaut Téléchargement de fichier sous php
    Bonjour,

    J'ai quelques soucis avec le téléchargements sous php. Alors voilà j'explique un petit peu comment je voudrais faire. Donc j'ai une machine ou mon site est dans le dossier '/var/www/'. Je voudrais faire partager des fichiers a titre privé des fichiers sur mon serveur, ces fichiers sont de différents types (.avi, .tar.gz, .flv, .zip et .mp4 et je crois que c'est tout, peut être aussi des pdf). Mais comme ces fichiers sont uniquement a usage privé je ne veux que personne puisse y accéder a par ceux qui ont un compte sur mon site. Je me suis dis qu'il pourrait être intéressant de placer ces fichier dans un autre répertoire que celui de mon site (a savoir /opt/), dans lequel je peux classe en catégorie mes fichiers (video, texte...).
    Donc j'ai créé une page pour lister les éléments d'un répertoire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    <?
    	$dir = opendir("/opt/films/");
    	while($file = readdir($dir)) {
    	$file = utf8_decode($file);
    		if($file=='.' OR $file=='..'){ 
    		}else{
    		echo '<a href="/index.php?page=Download&cat=videos&name='.$file.'">'.$file.'</a> <br />';
    		}
    	}
    	closedir($dir);
    	?>
    Ma page download force le download
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    <?
    $cat=$_GET['cat'];
    $name=$_GET['name'];
    $urlf='/opt/'.$cat.'/'.$name.'';
    echo $urlf;
    if(file_exists($urlf)){
    	header("Content-Type: application/force-download" );
    	header("Content-Length:".filesize($urlf));
    	header('Content-Disposition: attachment; filename="'.$name.'"');
    	readfile($urlf);
    }
    ?>
    Mon soucis est le suivant, lorsque je télécharge un fichier via le site, ce fichier est corrompu alors que quand j'essaye de le lancer sur la machine virtuel ou même de lire en vidéo directement par le site il n'y a aucun soucis.

    Donc est ce qu'il y a des choses a régler pour palier a ce problème?

    Est-ce une bonne solution?

    Est ce sécurisé?
    Faut il rajouter un .htaccess dans mon repertoire /opt/ ou autre?


    Merci aux gens qui auront pris le temps de lire ce sujet ainsi qu'a ceux qui y répondront.

  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
    hello, en regardant un de mes scripts php

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <?php ini_set("memory_limit","50M"); ?>
    cela ne viens pas forcement de la, mais c'est une piste

    ce qui donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ini_set("memory_limit","50M");
    header("Content-Type: application/force-download" );
    header('Content-Disposition: attachment; filename="'.$name.'"');
    readfile($urlf);

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 99
    Points : 55
    Points
    55
    Par défaut Re
    Rebonsoir,

    Merci pour cette réponse déjà. Alors j'ai testé en rajoutant ta commande mais cela ne marche pas. J'ai toujours la même erreur quand je télécharge.

    J'ai peut être mal exprimé le fait que mon fichier soit corrompu, le message exacte du lecteur windows multimedia est "Le lecteur windows media ne peut pas lire le fichier. Il est possible que le lecteur ne prenne pas en charge le type du fichier ou le codec utilisé pour la compression de ce dernier." (c'est un .avi).
    Et lorsque je teste par le lecteur vlc, la je n'ai aucun message.

    De plus j'ai remarque que lorsque je télécharge le fichier est marque comme un fichier 'rar archive' si cela peut aider :/

    Cordialement.

  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
    Ben du coup c'est quoi l’extension du fichier ( sur le serveur) que tu essai de lire avec un player ( je suis un peu perdu )

  5. #5
    Membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 99
    Points : 55
    Points
    55
    Par défaut Re
    L'extension sur le serveur est un .avi, http://xxx.xxx.xxx.xxx/test.avi et sa marche. Dans le title je vois test.avi(Objet video/x-msvideo).

  6. #6
    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
    arrête moi si je me trompe, mais normalement avec le script que l'on utilise, tu a deux choix, enregistrer ou ouvrir. Dans les deux cas l'os ( window, mac, linux.. ) , regarde l’extension du fichier, et propose un player adapté. Donc si ton os détecte pas que media player sait pas lire de l'avi , mais qui faut le diriger vers vlc... Comment mettre par défaut le player lors du téléchargement, ou au moins le proposer... Imagine que chez moi media player sache lire de l'avi...

    Je vais même allé plus loin, je n'ai ni vlc, ni media player d’installé comment je fais ?

  7. #7
    Membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 99
    Points : 55
    Points
    55
    Par défaut Re
    Bonjour,

    Donc l'extension de mon fichier étant en avi mozilla me propose de l'ouvrir avec le lecteur windows ou de l'enregistrer. Donc la je test en l'ouvrant directement mais bon je crois pas que sa change grand chose. Mais la ce que j'aimerai faire pour l'instant c'est vraiment pouvoir enregistrer correctement un fichier et pouvoir le réutiliser après. Pour ce qui est de la lecture en direct je verrai si j'arrive a faire un lecteur flash. Je te dis dès que le lecteur a bien voulu ouvrir un fichier dans le télécharger sur le disque dur.

    Cordialement.

  8. #8
    Membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 99
    Points : 55
    Points
    55
    Par défaut Re
    Donc je viens de finir de mettre en cache le fichier et comme on me propose de l'ouvrir directement avec le lecteur windows je l'ai fais et sa ne marche pas :/

  9. #9
    Membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 99
    Points : 55
    Points
    55
    Par défaut Re
    Donc, je me suis dis que tester les .avi c'était bien mais est ce que les .rar sa faisait pareil. Et apparemment oui. Alors lorsque je télécharge un .rar via le site j'ai un nouveau message d'erreur de 7-zip qui est "Unexpected end of archive". Si sa peut aider a résoudre mon problème par ce que je ne comprends absolument pas comment se passe un téléchargements et donc si il y a des options a mettre selon le type de fichier..

    Cordialement

  10. #10
    Membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 99
    Points : 55
    Points
    55
    Par défaut Petite découverte ^^
    Bonjour,

    Donc petite découverte, j'ai vu que certaines personnes utilisaient certaines commandes comme
    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
    16
    17
    18
     
    // je n'ai pas recopier tout le code mais juste ce qui est intéréssant
    switch(strrchr(basename($Fichier_a_telecharger), ".")) {
     
    case ".gz": $type = "application/x-gzip"; break;
    case ".tgz": $type = "application/x-gzip"; break;
    case ".zip": $type = "application/zip"; break;
    case ".pdf": $type = "application/pdf"; break;
    case ".png": $type = "image/png"; break;
    case ".gif": $type = "image/gif"; break;
    case ".jpg": $type = "image/jpeg"; break;
    case ".txt": $type = "text/plain"; break;
    case ".htm": $type = "text/html"; break;
    case ".html": $type = "text/html"; break;
    default: $type = "application/octet-stream"; break;
     
    }
    header("Content-Transfer-Encoding: $type\n"); // Surtout ne pas enlever le \n
    Ainsi que d'autres commandes comme celles-ci
    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
     
    switch ($fileextension) {
        Case ".wmv": $ctype = "video/x-ms-wmv"; break;
        Case ".zip": $ctype = "application/zip"; break;
        Case ".mp3": $ctype = "audio/x-mp3"; break;
        Case ".mpg": $ctype = "video/mpeg"; break;
        case ".avi": $ctype = "video/x-msvideo"; break;  
                 case ".pdf": $ctype = "application/pdf"; break;
                 case ".doc": $ctype = "application/msword"; break;
                 case ".gif": $ctype = "image/gif"; break;
                 case ".png": $ctype = "image/png"; break;
                 case ".jpg": $ctype = "image/jpg"; break;
                 default: $ctype="application/octet-stream";
       }
    header("Content-Type: $ctype" );
    Donc voila après je ne sais pas trop si cela fais grand chose au niveau du téléchargement. J'ai lu que le "Content-Transfer-Encoding" servait a définir a un encodage 7bits ou 8bits.

    Si quelqu'un pouvait m'éclairer la dessus, sa serait simpas.

    Cordialement.

  11. #11
    Membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 99
    Points : 55
    Points
    55
    Par défaut Et le miracle fut..
    Bonjour,

    Alors j'ai trouvé ce qui n'allais pas dans mon site, ce n'étais pas le code en lui même du téléchargement mais plus ma façon d'avoir codé mon site. Alors pour forcer le download, on utilise des header, et ces header justement ont une règle bien spécifique qui est :

    N'oubliez jamais que header() doit être appelée avant que le moindre contenu ne soit envoyé, soit par des lignes HTML habituelles dans le fichier, soit par des affichages PHP. Une erreur très classique est de lire un fichier avec include ou require, et de laisser des espaces ou des lignes vides, qui produiront un affichage avant que la fonction header() ne soit appelée. Le même problème existe avec les fichiers PHP/HTML standards.

    Alors certes oui j'avais une page pour mon header, mais je faisais une include de cette page depuis mon index.php (et ceci pour toute les pages) donc je me suis pas posé trop de question. Mais c'était en contradiction avec la règle du header. Donc voila voila, des grosses heures de casse tête pour au final comprendre ou mettre un header ^^.

    Donc bah je poste quand même mon download.php si jamais quelqu'un voulait voir un exemple:

    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    <?
    $cat=$_GET['cat'];
    $Fichier_a_telecharger=$_GET['name'];
    $chemin='/opt/'.$cat.'/';
    switch(strrchr(basename($Fichier_a_telecharger), ".")) {
    case ".gz": $type = "application/x-gzip"; break;
    case ".tgz": $type = "application/x-gzip"; break;
    case ".zip": $type = "application/zip"; break;
    case ".pdf": $type = "application/pdf"; break;
    case ".png": $type = "image/png"; break;
    case ".gif": $type = "image/gif"; break;
    case ".jpg": $type = "image/jpeg"; break;
    case ".txt": $type = "text/plain"; break;
    case ".htm": $type = "text/html"; break;
    case ".html": $type = "text/html"; break;
    default: $type = "application/octet-stream"; break;
    }
    header("Content-disposition: attachment; filename=$Fichier_a_telecharger"); 
    header("Content-Type: application/force-download"); 
    header("Content-Transfer-Encoding: $type\n"); // ne pas enlever le \n
    header("Content-Length: ".filesize($chemin . $Fichier_a_telecharger)); 
    header("Pragma: no-cache"); 
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0, public"); 
    header("Expires: 0"); 
    readfile($chemin . $Fichier_a_telecharger); 
    ?>
    Merci a ceux qui m'ont aidé. Sujet résolu :p

  12. #12
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 389
    Points : 10 422
    Points
    10 422
    Par défaut
    Citation Envoyé par ascito Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <?php ini_set("memory_limit","50M"); ?>
    Juste pour info au passage, cette commande n'est quasiment jamais prise en compte sur des serveurs mutualisés.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Téléchargement de fichier sous IE
    Par Nikamura dans le forum IE
    Réponses: 0
    Dernier message: 08/10/2009, 09h59
  2. Réponses: 5
    Dernier message: 06/02/2008, 17h49
  3. Pb de téléchargement d'un fichier sous IE
    Par IMS dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 24/01/2008, 17h26
  4. Ouverture de fichier sous PHP
    Par TeK55 dans le forum Langage
    Réponses: 3
    Dernier message: 09/05/2007, 11h50
  5. Téléchargement de fichier en PHP
    Par Badaboumpanpan dans le forum Langage
    Réponses: 7
    Dernier message: 25/06/2006, 16h14

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