Download un fichier qui est sur le serveur??
Résolu
leoetevan
Messages postés
110
Date d'inscription
Statut
Membre
Dernière intervention
-
leoetevan Messages postés 110 Date d'inscription Statut Membre Dernière intervention -
leoetevan Messages postés 110 Date d'inscription Statut Membre Dernière intervention -
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
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:
- Download un fichier qui est sur le serveur??
- Fichier bin - Guide
- Comment réduire la taille d'un fichier - Guide
- Comment ouvrir un fichier epub ? - Guide
- Fichier rar - Guide
- Fichier .dat - Guide
19 réponses
Bonjour,
essaye comme ça:
Tiens moi au courant si ça marche!
A+
Gaerebut
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
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é.
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é.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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
Pour moi, tu avais juste oublié de préciser la taille du fichier ... :-(
Désolé, je sais pas plus :-(
A+
Gaerebut
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
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
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
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�>�Ksp�/�� |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ù?
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�>�Ksp�/�� |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ù?
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
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
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...
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...
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
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
et l'adresse de la première ligne aussi est différente
le fichier qui va bien : 0000000f
l'autre fichier : 00000000
le fichier qui va bien : 0000000f
l'autre fichier : 00000000
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 ?
ç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 ?
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
<!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
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)
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)
Re,
oui, il ne faut JAMAIS qu'il n'y est quelque chose d'écrit avant un header!
A+
Gaerebut
oui, il ne faut JAMAIS qu'il n'y est quelque chose d'écrit avant un header!
A+
Gaerebut
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
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
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);
?>
<?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);
?>