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élechargement de fichier


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 151
    Points : 69
    Points
    69
    Par défaut Télechargement de fichier
    Bonjour,

    Le téléchargement de fichiers .doc ne marche pas. J'arrive bien à l'enregistrer mais au moment de l'ouvrir il me demande l'encodage... J'ai essayé plusieurs encodage (utf8, iso... ), rien à faire.

    Voici mon code
    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
     
    if ( $don['type'] == "pdf") $type = "application/pdf";
    else if ( $don['type'] == "doc") $type = "application/msword";
    else if ( $don['type'] == "xls") $type = "application/vnd.ms-excel";
    else $type = "application/octet-stream";
     
    $dossier = "../../".$don['dossier']."/";
    $file = $dossier.$don['nom_fichier'];
    $size = filesize($file);
    $name = $don['nom_fichier'];
     
    header("Content-disposition: attachment; filename=$name"); 
    header("Content-Type: application/force-download"); 
    header("Content-Transfer-Encoding: $type\n"); // Surtout ne pas enlever le \n
    header("Content-Length: ".$size); 
    header("Pragma: no-cache"); 
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0, public"); 
    header("Expires: 0"); 
    readfile($file);
    Merci de votre aide

    PS : Le téléchargement de pdf marche très bien?

  2. #2
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2008
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 504
    Points : 470
    Points
    470
    Par défaut
    as-tu essayé le binary ?

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 151
    Points : 69
    Points
    69
    Par défaut
    Rajouter ceci ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    header("Content-Transfer-Encoding: binary");
    Oui j'ai testé mais idem ça m'ouvre toujours l'option de filtre ASCII dans open office

  4. #4
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2008
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 504
    Points : 470
    Points
    470
    Par défaut
    J'avoue ne pas voir là...

    Dans le doute, je te suggérerai bien d'essayer de mettre un header directement sur la page, genre

    header('Content-Type: binary');

    Même si j'y crois pas trop...

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 151
    Points : 69
    Points
    69
    Par défaut
    Non j'ai toujours le même problème

  6. #6
    Membre éprouvé
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Points : 1 066
    Points
    1 066
    Par défaut
    Salut

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    header("Content-Transfer-Encoding: $type\n"); // Surtout ne pas enlever le \n
    Pourquoi ce fameux \n ? C'est bizarre, en général une ligne vide signale la fin des headers. J'avoue que ça m'intrigue...

    Autre question: si tu compares le doc sur le serveur au doc téléchargé, c'est exactement le même fichier ? Fais un md5 pour vérifier... j'ai déjà eu de sacrée surprises.

  7. #7
    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 free or not
    peu être es tu sur un serveur apache, alors que sur un serveur IIS, le traitement des fichiers .doc sont à priori pris en natif...

  8. #8
    Membre émérite
    Avatar de Eric2a
    Homme Profil pro
    Technicien
    Inscrit en
    Septembre 2005
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Corse (Corse)

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 225
    Points : 2 411
    Points
    2 411
    Par défaut
    Citation Envoyé par Antoine_935
    Pourquoi ce fameux \n ?
    Bien vu !

    Citation Envoyé par Antoine_935
    [...] j'ai déjà eu de sacrée surprises.
    Avec l'entête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    header('Content-Transfer-Encoding: binary');
    je pense qu'il n'y aura pas de soucis.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 151
    Points : 69
    Points
    69
    Par défaut
    Je suis bien sur apache ( j'utilise xampp ) ! Pour le md5 effectivement je n'ais pas la même chose sur le fichier stocké et le fichier téléchargé :s ! Comment faire?

  10. #10
    Membre éprouvé
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Points : 1 066
    Points
    1 066
    Par défaut
    Ah, on se rapproche du but

    Es-tu certain que $file pointe vers le bon fichier ? realpath devrait t'aider à savoir cela.

    Cela dit, enlève ce "\n" de tes headers, c'est peut-être bien la cause de tes soucis. Si les headers sont envoyés direct, ceux qui suivent le "\n" sont considérés comme le contenu du téléchargement.

    Si tu as un éditeur hexa sous la main, tu peux vérifier ça en ouvrant le fichier et en sondant les premier caractères.

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 151
    Points : 69
    Points
    69
    Par défaut
    J'espère qu'on se rapproche !

    Oui $file pointe bien vers le bon fichier, faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    echo "<a href=".$file.">fichier</a>";
    j'arrive bien à le dl et à l'ouvrir.

    J'ai enlevé le "\n" mais toujours rien

    Pour l'éditeur je te fais confiance

    Pour apache le problème viendrait de là alors?

  12. #12
    Membre émérite
    Avatar de Eric2a
    Homme Profil pro
    Technicien
    Inscrit en
    Septembre 2005
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Corse (Corse)

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 225
    Points : 2 411
    Points
    2 411
    Par défaut
    Tente à nouveau avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if(@ini_get('zlib.output_compression'))@ini_set('zlib.output_compression','Off');
    readfile($file);
    pour voir.

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 151
    Points : 69
    Points
    69
    Par défaut
    Toujours rien

  14. #14
    Membre éprouvé
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Points : 1 066
    Points
    1 066
    Par défaut
    Je sèche un peu j'avoue...

    N'est-il pas tout simplement possible de rediriger l'utilisateur vers le fichier ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    header('Location : ' . $file);
    Et sinon, essaye de repartir de zéro avec cet exemple de code:
    http://php.net/manual/en/function.readfile.php

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 151
    Points : 69
    Points
    69
    Par défaut
    Je souhaite protéger le dossier contenant les fichier à télécharger avec un htaccess :
    Repartir de zéro, je vais réessayer.

    Quand est-il d'apache? Le problème ne peut pas venir de là?

    Merci en tout cas de l'aide.

  16. #16
    Membre éprouvé
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Points : 1 066
    Points
    1 066
    Par défaut
    Ça m'étonnerait qu'Apache soit en cause.
    Je viens de découvrir la fonction virtual, qui pourrait t'intéresser.
    Jette un œuil au deuxième commentaire.

  17. #17
    Membre émérite
    Avatar de Eric2a
    Homme Profil pro
    Technicien
    Inscrit en
    Septembre 2005
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Corse (Corse)

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 225
    Points : 2 411
    Points
    2 411
    Par défaut
    Citation Envoyé par vocal94130
    J'ai essayé plusieurs encodage (utf8, iso... )
    Du script PHP ?
    S'il est encodé en UTF-8, assure toi qu'il s'agit bien d'UTF-8 (sans BOM)

    Peut-être qu'il y a des erreurs au début du script ?
    Pour le savoir, il faudrait voir les éventuels messages d'erreur. Pour ce faire, tu peux mettre en remarque les appels aux header(...) et à readfile.

    Mais bon... C'est vrai que c'est bizarre.

    Sinon, j'ai testé ceci chez moi (WinXP, IE8)
    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
    switch ($don['type']){
    	case 'pdf':	$type='application/pdf'; break;
    	case 'doc':	$type='application/msword'; break;
    	case 'xls':	$type='application/vnd.ms-excel'; break;
    	default:	$type='application/octet-stream';
    }
     
    $dossier=dirname(__FILE__).DIRECTORY_SEPARATOR.'..'.DIRECTORY_SEPARATOR.'..'.DIRECTORY_SEPARATOR.$don['dossier'].DIRECTORY_SEPARATOR;
    $name=basename($don['nom_fichier']);
    $file=$dossier.$name;
     
    if(@file_exists($file)){
    	$size=@filesize($file);
    	if(@ini_get('zlib.output_compression'))@ini_set('zlib.output_compression','Off');
    	header('Content-Type: '.$type);
    	header('Content-Disposition: attachment; filename="'.$name.'"');
    	header('Content-Length: '.$size);
    	header('Content-Transfer-Encoding: binary');
    	header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    	header('Cache-Control: private',false);
    	header('Pragma: public');
    	header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
    	@readfile($file);
    }
    Avec pour l'exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $don=array(
    	'type'=>'doc',
    	'dossier'=>'downloads',
    	'nom_fichier'=>'test.doc'
    );
    Ca fonctionne

  18. #18
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 151
    Points : 69
    Points
    69
    Par défaut
    Non ça ne marche toujours pas malgré tous les test . Le problème doit venir de ma machine.

    J'ai bien vérifié :
    - que c'était bien encodé en UTF-8
    - s'il y avait des erreurs dans le script
    - avec ton code.

    En ce qui concerne la fonction virtual, elle est spécifique à apache, je suis pas trop fan de la spécificité ! Merci quand même

    Tant pis je testerai sur le serveur quand le le mettrai en ligne.
    Merci de l'aide de tous.

    Je vous tiens au courant si cela fonctionne.

Discussions similaires

  1. télecharger des fichiers à partir de ma page jsp
    Par amine_smi dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 09/09/2009, 14h24
  2. impossible de télecharger un fichier via dl.free.fr
    Par kalliste2b dans le forum Internet
    Réponses: 2
    Dernier message: 15/08/2008, 10h56
  3. Télecharger un fichier video à partir d'une animation flash
    Par filemon dans le forum Intégration
    Réponses: 1
    Dernier message: 28/09/2007, 08h33
  4. Télechargé um fichier du net
    Par olifile dans le forum Windows Forms
    Réponses: 1
    Dernier message: 31/03/2007, 10h31
  5. Télecharger un fichier d'un serveur vers mon PC
    Par diamonds dans le forum Général Conception Web
    Réponses: 11
    Dernier message: 08/02/2007, 16h06

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