Download un fichier qui est sur le serveur??

Résolu/Fermé
leoetevan Messages postés 110 Date d'inscription mercredi 18 février 2009 Statut Membre Dernière intervention 16 juillet 2012 - 10 févr. 2010 à 09:22
leoetevan Messages postés 110 Date d'inscription mercredi 18 février 2009 Statut Membre Dernière intervention 16 juillet 2012 - 10 févr. 2010 à 13:57
Bonjour,

Je suis en train de créer un site sur lequel, j'ai besoin d'uploader des fichiers d'utilisateurs que d'autres pourrons downloader.

La partie upload fonctionne très bien. J'arrive à copier le fichier de l'utilisateur dans un dossier de mon choix sur le serveur. J'ouvre ce fichier et pas de problème, c'est bien le même que l'original (se que est plutot pas mal!! lol).
En revanche, la partie download ne fonctionne qu'à moitié. Lorsque je clic sur mon bouton "Télécharger", ça m'ouvre bien un cadre qui me propose "ouvrir avec" ou "enregistrer". Et j'arrive donc à le télécharger. Jusque là, tout va bien (ou presque!). Mon problème, c'est que le fichier télécharger est un fichier qui porte le même nom que celui sur le serveur sauf que le document est vide. Quand c'est un .doc, word m'affiche une page vierge. Lorsque c'est un .odt, writter m'affiche ça: PKbᄡm;^?

Mon code qui se trouve dans ma page download.php est celui-ci:

<?php
$chemFichier=$_GET['chemFichier']; //chemin type: /dossier1/dossier2/fichier.odt par exemple
$nomFichier =$_GET['nomFichier']; //nom type: fichier.odt
$extFichier =$_GET['extFichier'];

switch ($extFichier){
case ".doc": header("content-type: application/msword");
break;
case "docx": header("content-type: application/msword");
break;
case ".ppt": header("content-type: application/vnd.ms-powerpoint");
break;
case ".odt": header("content-type: application/vnd.oasis.opendocument.text");
break;
}

header('Content-Disposition: attachment; filename="'.$nomFichier.'"');
readfile($chemFichier);
?>

et le code de la page qui envoi les infos du fichier a fournir à download.php est celui-ci:

<?php
mysql_select_db($database_ConnexionPortail, $ConnexionPortail);
$query_infoProjet = "SELECT projet.libelleProj, projet.descrProj, date_format(projet.dteDebProj,'%d/%m/%Y') as dteDeb, date_format(projet.dteFinProj,'%d/%m/%Y') as dteFin, projet.cccProj FROM projet WHERE projet.idProj='$idProjet'";
$infoProjet = mysql_query($query_infoProjet, $ConnexionPortail) or die(mysql_error());
$row_infoProjet = mysql_fetch_assoc($infoProjet);
$totalRows_infoProjet = mysql_num_rows($infoProjet);

$chemFichier = $row_infoProjet['cccProj'];
$nomFichier = substr($chemFichier,64); // 64 parce que le chemin est plutôt long pour le moment :)
$extFichier = substr($nomFichier,-4); // -4 parce que je veux pouvoir prendre les fichiers .docx
?>

<body>
<a href="testDownload2.php?chemFichier=<?php echo $chemFichier.'&nomFichier='.$nomFichier.'&extFichier='.$extFichier; ?>"><input type="button" value="Télécharger" /></a>
</body>

Et avant que vous me posiez la question, mes variables sont bien remplies :) .Je n'ai pas mis tout le body mais j'affiche chaque varaible justement pour les tester.

Si vous avez une idée, ça m'intéresse vraiment parce que là, je suis perdu!!!!!

Merci d'avance
A voir également:

19 réponses

gaerebut Messages postés 1017 Date d'inscription mardi 30 octobre 2007 Statut Membre Dernière intervention 22 novembre 2013 171
10 févr. 2010 à 09:51
Bonjour,

essaye comme ça:

<?php
$chemFichier=$_GET['chemFichier']; //chemin type: /dossier1/dossier2/fichier.odt par exemple
$nomFichier =$_GET['nomFichier']; //nom type: fichier.odt
$extFichier =$_GET['extFichier'];
$tailleFichier = filesize($chemFichier);

switch ($extFichier){
case ".doc": header("content-type: application/msword");
break;
case "docx": header("content-type: application/msword");
break;
case ".ppt": header("content-type: application/vnd.ms-powerpoint");
break;
case ".odt": header("content-type: application/vnd.oasis.opendocument.text");
break;
}

header('Content-Length:'.$tailleFichier);
header('Content-Disposition: attachment; filename="'.$nomFichier.'"');
readfile($chemFichier);
?> 


Tiens moi au courant si ça marche!

A+
Gaerebut
0
leoetevan Messages postés 110 Date d'inscription mercredi 18 février 2009 Statut Membre Dernière intervention 16 juillet 2012 2
10 févr. 2010 à 10:05
Non. Ca ne change rien du tout. mais merci d'essayer en tout cas parce que là je désespère!!! lol
0
gaerebut Messages postés 1017 Date d'inscription mardi 30 octobre 2007 Statut Membre Dernière intervention 22 novembre 2013 171
10 févr. 2010 à 10:09
Vérifie sur le serveur si il est bien complet !
0
leoetevan Messages postés 110 Date d'inscription mercredi 18 février 2009 Statut Membre Dernière intervention 16 juillet 2012 2
10 févr. 2010 à 10:13
Oui quand j'ouvre le fichier directement du serveur, ça fonctionne bien. Le fichier s'ouvre normalement.

C'est se que je disais dans mon premier post, la partie upload fonctionne bien. C'est d'ailleur le premier truc que j'ai vérifié.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
gaerebut Messages postés 1017 Date d'inscription mardi 30 octobre 2007 Statut Membre Dernière intervention 22 novembre 2013 171
10 févr. 2010 à 10:29
Il s'ouvre mais il est complet ?! lol
0
leoetevan Messages postés 110 Date d'inscription mercredi 18 février 2009 Statut Membre Dernière intervention 16 juillet 2012 2
10 févr. 2010 à 10:33
lol oui oui il est complet! il affiche bien la même chose que l'original!lol
0
gaerebut Messages postés 1017 Date d'inscription mardi 30 octobre 2007 Statut Membre Dernière intervention 22 novembre 2013 171
10 févr. 2010 à 10:36
C'est bizarre car j'ai également fait plusieurs fois des upload de fichier (PDF complet lol), et je n'est pas eu de soucis ce ce type...
Pour moi, tu avais juste oublié de préciser la taille du fichier ... :-(
Désolé, je sais pas plus :-(

A+
Gaerebut
0
leoetevan Messages postés 110 Date d'inscription mercredi 18 février 2009 Statut Membre Dernière intervention 16 juillet 2012 2
10 févr. 2010 à 10:40
C'est moche!! je ne vois vraiment pas se qui cloche!! merci quand même. Si une idée te vient à l'esprit, n'hésite pas à me le faire savoir
0
Bonjour

Enlève les ligne header pour qu'il affiche directement le readfile
Tu verras bien si ce qu'il envoie ressemble au contenu d'un fichier, ou est vide, ou est un message d'erreur...
Tu peux aussi tester is_file ($chemFichier), pour voir
0
leoetevan Messages postés 110 Date d'inscription mercredi 18 février 2009 Statut Membre Dernière intervention 16 juillet 2012 2
10 févr. 2010 à 11:05
Bonjour,

Lorsque j'enlève les lignes header, voilà se qu'il m'affiche:

PKb�m;^�2 ''mimetypeapplication/vnd.oasis.opendocument.textPKb�m;Configurations2/statusbar/PKb�m;'Configurations2/accelerator/current.xmlPKPKb�m;Configurations2/floater/PKb�m;Configurations2/popupmenu/PKb�m;Configurations2/progressbar/PKb�m;Configurations2/menubar/PKb�m;Configurations2/toolbar/PKb�m;Configurations2/images/Bitmaps/PKb�m; content.xml��r��_�Q&���/�+�S�f7Ikoݵ�i�v ��%  %{�%yk<��{��I��EQ�DS��7�>�K𜃃sp�/�� |4!\P���UC$t�G��I��� �[���w_�ᐺ��17 H. c�;}���ϰ�� ~��YD�9V?�Ws����p;&7qUd ����gV�yl��iUd BͣYU��CR"�.n|�=���8��t:�Ou�G����L�6c��ࢄ� �sM�9�0�m�a��I�<>c,cU"hU�:��4�szZ >�4&<��w3��`���6� i���KA� ��_g���H�o�W�xL�6h(b.$å6��er1g�V��-

et ça se n'est que qu'elque ligne. A la base, c'est un fichier .odt

Le is_file ($chemFichier) il faudrait que je le mette où?
0
Le is_file n'est plus utile, on voit qu'il trouve bien le fichier et qu'il l'envoie bien.

Peux-tu comparer les fichiers originaux avec ceux que tu downloades ? La taille au moins (la taille exacte, pas celle occupée sur le disque). Regarde le début avec un éditeur hexadécimal pour voir s'il y a des modifications
0
leoetevan Messages postés 110 Date d'inscription mercredi 18 février 2009 Statut Membre Dernière intervention 16 juillet 2012 2
10 févr. 2010 à 11:48
en hexa, non ça ne sont pas les même.
Celui sur le serveur et qui s'ouvre bien fait
64,00KB avec streams
64,00KB sans streams

Celui téléchargé fait
64,02KB avec streams
64,00KB sans streams

Pour moi c'est un peu du chinois lol mais si ça peut t'aider à m'aider...
0
leoetevan Messages postés 110 Date d'inscription mercredi 18 février 2009 Statut Membre Dernière intervention 16 juillet 2012 2
10 févr. 2010 à 11:50
Le début du fichier qui fonctionne en hexa:

d0 cf 11 e0 a1 b1 1a e1 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 3e 00 03 00 fe ff 09 00
06 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00
79 00 00 00 00 00 00 00 00 10 00 00 7c 00 00 00
01 00 00 00 fe ff ff ff 00 00 00 00 78 00 00 00
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff

l'autre fichier:

3c 21 44 4f 43 54 59 50 45 20 68 74 6d 6c 20 50
55 42 4c 49 43 20 22 2d 2f 2f 57 33 43 2f 2f 44
54 44 20 58 48 54 4d 4c 20 31 2e 30 20 53 74 72
69 63 74 2f 2f 45 4e 22 20 22 68 74 74 70 3a 2f
2f 77 77 77 2e 77 33 2e 6f 72 67 2f 54 52 2f 78
68 74 6d 6c 31 2f 44 54 44 2f 78 68 74 6d 6c 31
2d 73 74 72 69 63 74 2e 64 74 64 22 3e 0d 0a 3c
68 74 6d 6c 20 78 6d 6c 6e 73 3d 22 68 74 74 70
0
leoetevan Messages postés 110 Date d'inscription mercredi 18 février 2009 Statut Membre Dernière intervention 16 juillet 2012 2
10 févr. 2010 à 11:52
et l'adresse de la première ligne aussi est différente

le fichier qui va bien : 0000000f
l'autre fichier : 00000000
0
Et l'adresse de la première ligne aussi est différente
ça veut dire quoi, l'adresse de la première ligne d'un fichier ? Un fichier commence au début, c'est tout
De toutes façons, il y a un gros problème : le code hexa que tu montres commence par <!DOCTYPE

Le script que tu montres dans ton 1er post et que tu appelles download.php ne serait-il pas inclus dans un autre, qui s'appellerait testDownload2.php toujours d'après ton 1er message
Car on a l'impression que tu envoies plus que ton fichier
Peux tu donner TOUT le script de download ?
0
leoetevan Messages postés 110 Date d'inscription mercredi 18 février 2009 Statut Membre Dernière intervention 16 juillet 2012 2
10 févr. 2010 à 12:31
oui désolé. Il n'y a pas de download.php. Ma page dowload est testDownload2.php. En voici le code

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Document sans titre</title>
</head>
<?php
$chemFichier=$_GET['chemFichier']; //chemin type: /dossier1/dossier2/
$nomFichier =$_GET['nomFichier']; //nom type: fichier.odt
$extFichier =$_GET['extFichier'];
$tailleFichier = filesize($chemFichier);

switch ($extFichier){
case ".doc": header("content-type: application/msword");
break;
case "docx": header("content-type: application/msword");
break;
case ".ppt": header("content-type: application/vnd.ms-powerpoint");
break;
case ".odt": header("content-type: application/vnd.oasis.opendocument.text");
break;
}
header('Content-Transfer-Encoding: none');
header('Content-Length:'.$tailleFichier);
header('Content-Disposition: attachment; filename="'.$nomFichier.'"');

readfile($chemFichier);
?>
<body>
</body>
</html>

et le code qui m'envoi sur cette page, c'est celui de mon premier post
0
Voila la solution !

TOUT ce qu'il y a avant <?php est en trop De même pour tout ce qui est après le ?>
Ça se retrouve dans le fichier transmis, qui, du coup, est corrompu

Les balises <!doctype, <html> etc.. sont pour les documents HTML. Or toi, tu n'envoies pas un document HTML mais un fichier. Tu ne dois rien envoyer d'autre que les header() et le fichier
Fais attention de n'avoir même aucun caractère avant le <?php (même pas une ligne vide) ni après le ?> (même pas un caractère de fin de ligne)
0
gaerebut Messages postés 1017 Date d'inscription mardi 30 octobre 2007 Statut Membre Dernière intervention 22 novembre 2013 171
10 févr. 2010 à 13:20
Re,

oui, il ne faut JAMAIS qu'il n'y est quelque chose d'écrit avant un header!

A+

Gaerebut
0
aucun rapport.
Il peut y avoir quelque chose avant le header, car il peut y avoir une bufferisation des données.
Le problème dans ce cas est que les informations transmises inutilement corrompent le fichier. Elles le corrompraient exactement de la même manière si elles étaient placées après les headers
0
leoetevan Messages postés 110 Date d'inscription mercredi 18 février 2009 Statut Membre Dernière intervention 16 juillet 2012 2 > le père
10 févr. 2010 à 13:31
En gros, tu es en train de me dire qu'il faut que je cré un fichier.php et dedans, je ne met QUE ça?

<?php
$chemFichier=$_GET['chemFichier']; //chemin type: /dossier1/dossier2/
$nomFichier =$_GET['nomFichier']; //nom type: fichier.odt
$extFichier =$_GET['extFichier'];
$tailleFichier = filesize($chemFichier);

switch ($extFichier){
case ".doc": header("content-type: application/msword");
break;
case "docx": header("content-type: application/msword");
break;
case ".ppt": header("content-type: application/vnd.ms-powerpoint");
break;
case ".odt": header("content-type: application/vnd.oasis.opendocument.text");
break;
}
header('Content-Transfer-Encoding: none');
header('Content-Length:'.$tailleFichier);
header('Content-Disposition: attachment; filename="'.$nomFichier.'"');

readfile($chemFichier);
?>
0
leoetevan Messages postés 110 Date d'inscription mercredi 18 février 2009 Statut Membre Dernière intervention 16 juillet 2012 2
10 févr. 2010 à 13:37
Ok Ok merci. Je ne sais pas quoi dire. Pour moi le DOCTYPE était une chose obligatoire. Effectivement, ça fonctionne impeccable maintenant. Et merci pour les explications.
C'est en faisant des erreurs qu'on apprend dit t'on!! lol

Merci encore
0
Pour moi le DOCTYPE était une chose obligatoire
Il faut garder un esprit critique. Rien n'est "obligatoire" dans l'absolu, seulement dans certains contextes. Et justement, tu sortais de ce contexte.
0
leoetevan Messages postés 110 Date d'inscription mercredi 18 février 2009 Statut Membre Dernière intervention 16 juillet 2012 2
10 févr. 2010 à 13:57
Je te remercie encore. J'étais là dessus depuis hier midi et je commençais à désespérer! lol Mais je comprends mieux mon erreur maintenant.
0