Upload de fichiers

 

Upload de fichiers

  1. Fonctionnement
  2. Formulaire d'upload
  3. Réception et traitement
  4. Infos complémentaires
  5. Liens connexes

Fonctionnement

L'upload de fichier via le formulaire adapté se fait non pas par le protocole FTP, mais HTTP.
Pour simplifier, les données dont le fichier uploadé est constitué sont envoyées de la même manière que les données classiques d'un formulaire, mais en utilisant une "frontière" (boundary en anglais) pour séparer les données du fichier des données classiques du formulaire; On parle alors d'un flot de données multiple [1].
Tout comme pour les emails donc, chaque partie du flot de données est accompagnée d'entêtes de description (type MIME, taille des données, etc…)
Pour en savoir plus, reportez vous à la RFC 1867 (cf lien en bas de page).

Formulaire d'upload

Passons maintenant à la pratique. :-)
Pour uploader un fichier, il nous faut d'abord constituer le formulaire adéquat.
En dehors, d'éventuels champs texte, password, checkbox ou autre, il nous faut placer un champ de type file. Il nous faut également spécifier que le formulaire est constitué de plusieurs parties (les données classiques, et les données du fichier). Pour cela, nous ajouterons l'attribut enctype avec la valeur multipart/form-data à la balise form du code html.
Voici un formulaire de base, avec uniquement le champ de type file et le bouton de soumission :

<form method="post" enctype="multipart/form-data" action="upload.php">
<p>
<input type="file" name="fichier" size="30">
<input type="submit" name="upload" value="Uploader">
</p>
</form>

Nous avons donné au champ de type file le nom "fichier". Cela nous servira pour traiter le fichier uploadé.
Vous pouvez également ajouter un champ de type hidden avec pour nom MAX_FILE_SIZE et valeur la taille maximale en octet, que le fichier peut faire.

Note : Prenez soin de ne pas oublier l'attribut enctype de la balise form, c'est un erreur fréquente !

Réception et traitement

Une fois le formulaire soumis, et si tout se passe correctement, le fichier est alors copié dans le dossier temporaire des fichiers uploadés [2] mais n'est pas encore présent sur l'espace du site, il nous faudra le copier sur notre espace web.
Quoi qu'il arrive, le fichier est supprimé du dossier temporaire à la fin de l'éxécution du script.

Le fichier uploadé est disponible via le tableau global $_FILES ($HTTP_POST_FILES si vous êtes avec php < 4.1.0) ou directement avec le nom que l'on a donné au formulaire si registar_globals est fixé à on dans la configuration de php.
Nous avons alors les variables suivantes (avec ici "fichier" pour le nom du champ de type file) :

$_FILES['fichier']['name']
Contient le nom d'origine du fichier
$_FILES['fichier']['tmp_name']
Nom temporaire du fichier dans le dossier temporaire du système
$_FILES['fichier']['type']
Contient le type MIME du fichier
$_FILES['fichier']['size']
Contient la taille du fichier en octets
$_FILES['fichier']['error']
Code de l'erreur (le cas échéant) (disponible à partir de php 4.2.0)

Première chose à faire, vérifier que l'opération s'est bien passée en vérifiant la présence du fichier dans le dossier temporaire; pour cela, nous avons à notre disposition la fonction is_uploaded_file().
Ensuite, vérifier ce qui nous a été envoyé; Si on s'attend à une image, on vérifie si l'extension est correcte par exemple.
Une fois que l'on est sùr que tout est ok, on copie le fichier sur notre espace web à l'aide de la fonction move_uploaded_file() qui est plus sùre que la fonction copy(), car elle vérifie que le fichier à copier vient bien du dossier temporaire (et donc, provient d'un formulaire d'upload).

A partir de php 4.2.0, vous avez également un index error dans le tableau $_FILES['fichier'], vous indiquant plus précisément les raisons d'un éventuel échec.
Voici les différents codes et l'erreur leur correspondant :

UPLOAD_ERR_OK
Valeur : 0; Aucune erreur, le fichier a bien été uploadé
UPLOAD_ERR_INI_SIZE
Valeur : 1; Le fichier excède le poids autorisé par la directive upload_max_filesize de php.ini
UPLOAD_ERR_FORM_SIZE
Valeur : 2; Le fichier excède le poids autorisé par le champ MAX_FILE_SIZE s'il a été donné
UPLOAD_ERR_PARTIAL
Valeur : 3; Le fichier n'a été uploadé que partiellement
UPLOAD_ERR_NO_FILE
Valeur : 4; Aucun fichier n'a été uploadé

Note : Attention, les constantes UPLOAD_ERR_* ne sont disponibles qu'à partir de php 4.3.0. Sur les versions précédentes, il vous faudra utiliser directement les numéros des codes d'erreur.

Voici notre fichier php qui traitera les données du formulaire.
Nous partons ici du principe que nous voulons un fichier image en réception.

<?php

if( isset($_POST['upload']) ) // si formulaire soumis
{
    $content_dir = 'upload/'; // dossier où sera déplacé le fichier

    $tmp_file = $_FILES['fichier']['tmp_name'];

    if( !is_uploaded_file($tmp_file) )
    {
        exit("Le fichier est introuvable");
    }

    // on vérifie maintenant l'extension
    $type_file = $_FILES['fichier']['type'];

    if( !strstr($type_file, 'jpg') && !strstr($type_file, 'jpeg') && !strstr($type_file, 'bmp') && !strstr($type_file, 'gif') )
    {
        exit("Le fichier n'est pas une image");
    }

    // on copie le fichier dans le dossier de destination
    $name_file = $_FILES['fichier']['name'];

    if( !move_uploaded_file($tmp_file, $content_dir . $name_file) )
    {
        exit("Impossible de copier le fichier dans $content_dir");
    }

    echo "Le fichier a bien été uploadé";
}

?>

Bien entendu, rien ne vous oblige à garder le nom d'origine (disponible dans $_FILES['fichier']['name']) du fichier lorsque vous le copiez sur votre espace web. Vous pouvez parfaitement lui attribuer un autre nom. [3]

Note : J'attire votre attention sur le fait que le code ci-dessus comporte une faille de sécurité. En effet, je vous invite à tester le code suivant :

<?php
$fw = fopen("hack.php\0.png", "w");
fwrite($fw, "<?php echo 'Je vous ai hacké'; ");
fclose($fw);

Et le fichier créé portera bien le nom "hack.php". Cela vient de ce qu'en C, le caractère null (placé ici dans le nom de fichier avec \0) marque la fin de la chaîne. PHP ne filtre manifestement pas le nom de fichier passé en argument de fopen() (et ça vaut certainement pour les autres fonctions de création de fichier).

Maintenant, imaginez ce que peut faire un attaquant avec votre formulaire d'upload… Tout simplement placer du code PHP à exécuter sur votre serveur.

Il est donc indispensable de vérifier que le nom du fichier uploadé ne comporte pas le caractère null ni, tant qu'à faire, aucun autre caractère de contrôle ou slashe et backslashe. Voici un morceau de code basé sur celui donné plus haut pour réaliser cette opération :

if( preg_match('#[\x00-\x1F\x7F-\x9F/\\\\]#', $name_file) )
{
    exit("Nom de fichier non valide");
}
else if( !move_uploaded_file($tmp_file, $content_dir . $name_file) )
{
    exit("Impossible de copier le fichier dans $content_dir");
}

Informations complémentaires

Le protocole HTTP n'est pas, à l'origine, prévu pour l'upload de fichiers. Cette utilisation doit donc rester marginale, d'autant plus que la taille des fichiers uploadés est limitée par la directive upload_max_filesize dans le fichier de configuration de php. Par défaut, elle est fixée à 2 Mo mais une limite peut également être fixée dans la configuration du serveur.
Enfin, la plupart des hébergeurs gratuit désactivent la possibilité d'uploader des fichiers par cette méthode [4], donc vérifiez d'abord si l'upload est autorisé sur votre serveur ;-)

Liens connexes

Article écrit le / Mis à jour le par Bobe
[119] commentairesTop

Des commentaires ?

Auteur : Morpheus • 17/01/2003 @ 22:52 • #171

Bien l'article

Auteur : Ange • 17/02/2003 @ 17:02 • #206

L'upload de fichier me semble bien moins obscure maintenant. Un grand merci de la part d'une petite padawan en PHP

Auteur : emcyze • 15/03/2003 @ 13:51 • #251

c est exactement ce ke je cherchais ...

merci beaucoup pr l article!

Auteur : kurt • 03/04/2003 @ 14:50 • #266

Warning: Unable to create 'upload/pvp2_120x185.jpg': No such file or directory in /var/www/html/modules/editeurs_teste/fileupload.php on line 22

Warning: Unable to move '/tmp/php0kYBP3' to 'upload/pvp2_120x185.jpg' in /var/www/html/modules/editeurs_teste/fileupload.php on line 22
Impossible de copier le fichier dans upload/

voilà le problème que j'ai, il m'affiche ceci, si qqun peut m'aider...
ps : je développe sous linux.

Auteur : kurt • 03/04/2003 @ 15:05 • #267

voilà mon mail si qqun veut m'aider: kurt10101@hotmail.com

Auteur : hix • 07/04/2003 @ 23:47 • #274

vraiment bien !!

je cherchais j'ai trouve !!

Auteur : Vice • 28/05/2003 @ 12:00 • #333

franchement bobe

tu t'es gavé sur l'article !
chapeau bas man

:)) thious

Auteur : Shroom • 03/12/2003 @ 00:03 • #464

Superbe article !!
non seulement trés lisible mais en plus efficace, ke du bonheur =)

Auteur : Squallynou • 16/12/2003 @ 16:27 • #469

Meuh c'est très bien ça ! :) Justement il me le falait car comme je gere une équipe pour mon site : [lien] il me fallait savoir comment leur permettre d'uploader des fichiers SANS passer par le ftp et donc connaitre le pass et tout.
Donc maintenant en plus des infos sondages envoi de mail et autres ptits trucs qui leur sont permis via les modules que j'ai créé pour eux, ils pourront enfin aussi envoyer directement les screenshot eux même sans passer par moi :-p

Ca pete merciiiiiiiiii :-p

Auteur : Marc ou Net • 17/12/2003 @ 11:05 • #470

l'explication est parfaite est tout marche. Mais je voudrais savoir s'il est possible par un site PHP de créer un dossier. Par exemple je souhaite ranger le fichier dans le dossier "Applis" alors qu'il n'existe pas dans le dossier ou je vaux tout mettre. Y'a t'il un moyen ??? ou est-ce que la création de dossiers contenus dans le chemin d'accès est automatique ??? Bon je sais je ne suis pas très clair... :(

Auteur : Mel is back • 24/12/2003 @ 10:56 • #475

Impeccable, que dire de plus ?

Auteur : webos • 25/12/2003 @ 14:40 • #476

Nikel, c'est les précisions que je recherchais.

Merci

Auteur : raph • 27/01/2004 @ 09:18 • #491

Superbe ce que je voulais trouver est là
Bravo très clair et présentation très correcte des fonctions. Les pages sont "clean" ce qui ne gache rien en les lisant.
A+
R@ph
[lien]
bonne continuation

Auteur : sponche • 08/03/2004 @ 14:50 • #524

très très bi1 tout ça!
C exactement ce que je cherchait!
ça fé plaisir kan même!;-)

@+

sponche!

Auteur : nighthawk • 16/03/2004 @ 15:06 • #530

Franchement ...

Un code comme celui - ci :

ça ne se commente pas...
ça... s'admire ...

:)

Auteur : Ker • 20/03/2004 @ 17:55 • #532

Je passais par là et je dois dire ....
... Rien à dire ;o)

Auteur : cki • 08/04/2004 @ 14:10 • #535

merci

Auteur : Apolypse • 09/04/2004 @ 16:12 • #537

L'upload pur et simple.

Et qui marche!!!!

Une rareté...

Chapeau l'artiste.

Auteur : mike • 21/04/2004 @ 13:40 • #543

j'ai une petite question :

est il possible d'uploader des fichiers de plus de 2 Mo en php si mon site est sur mon PC par exemple et pas sur un serveur web car je dois recevoir des fichiers important du mexique ,,,,
merci d'avance

Auteur : aurely67 • 28/04/2004 @ 13:22 • #547

Bravo pour cette explication claire et précise.
Elle m'a beaucoup aidé, merci.

Auteur : Bobe • 29/04/2004 @ 03:58 • #548

mike: Relis le dernier paragraphe de l'article.

Auteur : jam • 04/05/2004 @ 16:50 • #550

Merci !!!!!!!!
je galerai depuis au moin 2 heures sur un script plus complexe...
Mais ce tuto est claire et très complet!
Bravo!

Auteur : farald • 12/05/2004 @ 23:43 • #560

c'est très bon ça marche impec chez moi simplement j'ai eu du mal a comprendre qu'il fallait creer un dossier upload a la racine de mon site lol enfin bref j'ai pas mis longtemps a m'en rendre compte et je pense que c une précision importante.

merci a ++ all bon php :)

Auteur : yoyo • 24/05/2004 @ 11:23 • #568

Bonjour,
j'ai juste un piti problème c'est qu'à chaque fois que j'essai d'uploader un fichier, il me marque 'Le fichier est introuvable'.
Or quand j'affiche toutes les variables il semble que le fichier est bien présent dans le répertoire temporaire et quand je demande le code de l'erreur il m'affiche 0 donc pas d'erreur
Si quelqu'un peut m'aider?
Merci

Auteur : PHPaddict • 06/06/2004 @ 18:44 • #579

Merci Beaucoup! Ça m'as fais sauver un temps fou cet article,continuez comme ça les gars! excellent site! en tête de mes favoris!

Auteur : NOche • 09/07/2004 @ 11:51 • #598

Kurt > Il faut que tu changes les droits de ton répertoire d'upload.
En mettant un chmod 777 dessus tu es sûr que ça va marcher, le problème est que c'est pas très secure. Que quelqu'un me reprenne si je me trompe mais normalement si le user d'apache (nobody) est dans le groupe propriétaire du repertoire et que le groupe a le droit d'écriture ça suffit pas besoin de donner l'accès à n'importe qui, non ?

Auteur : vanquish • 23/08/2004 @ 10:22 • #613

Excellent article Bobe, c'est juste dommage qu'il soit mal référencé, ça aiderait de nombreuses personnes ;o)

Auteur : eric • 14/09/2004 @ 18:01 • #621

bonjour, super script!
je voudrais renomer le fichier ainsi uploadé comment faire?
j'ai le futur nom ds une variable($isbn)

Auteur : lili • 23/09/2004 @ 10:11 • #622

tout marche bien sauf ... quand je tente d'uploader un fichier superieur a environ 200ko ???
pourtant ma varialbe $file_max_size = 200000 et la configurationde du serveur php est autorisée à 2097152
pourriez vous m'aider

Auteur : Brahmsoft • 12/12/2004 @ 21:47 • #636

C cool la méthode d'upload par le formulaire mais le probléme c que la plupart des prestataires bloquent le repertoire temporaire par le quel transitent les fichiers téléchargés (pour des raisons de sécurité).
Kelkun connait il une autre méthode ? je suis bloqué dessus depuis 2 weeks !

Auteur : petitejean • 27/05/2005 @ 16:32 • #690

Bon article

Auteur : benichoukkke • 05/06/2005 @ 16:56 • #692

heu j'ai comme qui dirait un prob si kk1 peut m'aider , je laisse mon mail : ben.hesmans(at)gmail.com

Warning: move_uploaded_file(images/banniere.jpg): failed to open stream: Permission denied in /home/alouny1939/domains/veroniqueceramique.heb4you.com/public_html/upload/upload.php on line 25

Warning: move_uploaded_file(): Unable to move '/tmp/phpRiOO3E' to 'images/banniere.jpg' in /home/alouny1939/domains/veroniqueceramique.heb4you.com/public_html/upload/upload.php on line 25
Impossible de copier le fichier dans images/

Auteur : benichoukkke • 08/06/2005 @ 13:35 • #694

rebonjour , j'ai trouvé quelqu'un qui m'a aidé .... le problème venait de la config des dossiers .... il faut le mettre en chmod 777

z+

Auteur : Lunatic • 20/08/2005 @ 01:32 • #711

Petit retour d'expérience.

J'ai voulu utiliser la variable $_FILES['fichier']['type'], donnant le type mime du fichier, pour contrôler les fichiers uploadés. Je pensais que cela était une méthode plus sécurisée qu'une simple vérification d'extension...

Mais en fait voilà : le type mime envoyé dépend du navigateur. Renommez un fichier texte "exemple.txt" en "exemple.jpg" : sous Firefox, même en utilisant le type mime, le contrôle s'avère inexact ! Le type sera donné comme "image/jpg"... Par contre, sous IE le contrôle fonctionne correctement.

Pour contourner le problème, il faut utiliser la fonction mime_content_type() en lieu est place de la variable $_FILES['fichier']['type']...

Auteur : kixer3 • 12/10/2005 @ 20:42 • #732

l'explication est parfaite est tout marche. Mais je voudrais savoir s'il est possible par un site PHP de créer un dossier. Par exemple je souhaite ranger le fichier dans le dossier "Applis" alors qu'il n'existe pas dans le dossier ou je vaux tout mettre. Y'a t'il un moyen ??? ou est-ce que la création de dossiers contenus dans le chemin d'accès est automatique ??? Bon je sais je ne suis pas très clair... :(

--------------------------------------

tu peu creer un dossier avc PHP en utilisant la fonction
mkdir('[nom du dossier]', [droit du dossier]);

exemple: mkdir('mondossier', 0777);
puis tu met un lien vers celui ci.... bon script a +!

kixer3 webmaster...http://kixer3.tk/

Auteur : redbe.ifrance.com • 17/10/2005 @ 15:39 • #744

aidez moi pour upload des donneés vers mon site redbel.ifrance.com c'est un grand probleme qui m'obstacle

Auteur : titenoob • 30/10/2005 @ 13:06 • #752

Cela m'a bien rendu service. Merci.

Auteur : Kernox • 18/11/2005 @ 01:20 • #760

Excellentissime , j'ai tout capté en quelque seconde a peine. Ca c'est ce qui s'appel un bon tuto :)

Auteur : ylb • 24/11/2005 @ 18:59 • #762

Il faut aussi vérifier l'extension du fichier et pas seulement le type mime , la avec ce script par exemple je peux faire passer un fichier .php pour un fichier .jpg !!!!(avec une requete http)

A corriger au plus vite !

Auteur : herrads • 10/12/2005 @ 12:38 • #766

J'ai un problème très grave pour le téléchargement de plusieurs fichiers, cela fait 2 semaine mais sans suite, veuillez m'aider s'il vous plait; Voici le code de traite de ficihers telecharger.

if (isset($_FILES['userfile1'])) $userfile1=$_FILES['userfile1'];
if (isset($_FILES['userfile2'])) $userfile2=$_FILES['userfile2'];
if (isset($_FILES['userfile3'])) $userfile3=$_FILES['userfile3'];

$nom_image=basename($userfile1['name'][0]);
$nom_image2=basename($userfile2['name'][1]);
$nom_image3=basename($userfile3['name'][2]);
// if ($nom_image !="" ){
$fichier_tmp=$userfile1['tmp_name'];
$fichier_tmp2=$userfile2['tmp_name'];
$fichier_tmp3= $userfile3['tmp_name'];
echo "<BR>$fichier_tmp<BR>";
echo "<BR>$fichier_tmp2<BR>";
echo "<BR>$fichier_tmp3<BR>";
// $destination="sphinx/photos/".$nom_image;
$destination='c:/program files/easyphp1-8/www/sphinx/photos/'.$nom_image;
$destination2='c:/program files/easyphp1-8/www/sphinx/photos/'.$nom_image2;
$destination3='c:/program files/easyphp1-8/www/sphinx/photos/'.$nom_image3;
// echo $nom_image2;
// echo $destination2;
// echo $destination3;
// $tmptb=getimagesize($destination);
$requete8 = "INSERT INTO `photos`(`id_photo`, `chemin`, `id_vehicule` ) VALUES('', '$nom_image', '$id_vehicule')";
mysql_query($requete8 ) or die(`Erreur SQL !`.$requete8.`<br>`.mysql_error());
$requete9 = "INSERT INTO `photos`(`id_photo`, `chemin`, `id_vehicule` ) VALUES('', '$nom_image2', '$id_vehicule')";
mysql_query($requete9 ) or die(`Erreur SQL !`.$requete9.`<br>`.mysql_error());
$requete10 = "INSERT INTO `photos`(`id_photo`, `chemin`, `id_vehicule` ) VALUES('', '$nom_image3', '$id_vehicule')";
mysql_query($requete10 ) or die(`Erreur SQL !`.$requete10.`<br>`.mysql_error());
// if (strlen ($fichier_tmp) >0){
// }
if (move_uploaded_file($fichier_tmp, $destination)) echo "fichier déplacé";
else echo"impossible de déplacer fichier1";
if (move_uploaded_file($fichier_tmp2, $destination2)) echo "fichier2 déplacé";
else echo"impossible de déplacer fichier2";
if (move_uploaded_file($fichier_tmp3, $destination3)) echo "fichier3 déplacé";
else echo"impossible de déplacer fichier3";// {
}

Voici le code du formulaire:
<td height="19" width="185">
<p aligh="left"><font color="#000000" face="Arial" size="+1"><i>Photo 1 : </i></font>
<input name="userfile1" type="file" size="30">
<input type="hidden" name="MAX_FILE_SIZE" value="1024" ><br>
<font color="#000000" face="Arial" size="+1"><i>Photo 2 : </i></font>

<input name="userfile2" type="file" size="30"><BR>
<font color="#000000" face="Arial" size="+1"><i>Photo 3 : </i></font>
<input name="userfile3" type="file" size="30"><BR>

</td>

Auteur : PAUL • 29/12/2005 @ 19:30 • #779

superbe article.
Pedagogique et bien presenté.
Du bonheur en boite....
Merci l'ami !

Auteur : Symen_4ab • 30/12/2005 @ 16:35 • #780

Très bon tutoriel, mon formulaire d'upload est presque en ligne maintenant.
Quelques petites astuces que j'ai employées :

1. Pour générer un nom de fichier unique, et éviter ainsi l'écrasement d'ancien fichiers, j'ai tout simplement utilisé time() :
// on copie le fichier dans le dossier de destination
$timeline = time();
$name_file = $timeline . "-" . $_FILES['fichier']['name'];

2. Pour contrôler que le fichier soit bien une image, ne pouvant pas utiliser mime_content_type(), j'ai utilisé une fonction gd (que je peux utiliser, par contre ;) )
// deuxième contrôle, par GD
if (!getimagesize($_FILES['fichier']['tmp_name']))
{
exit("GD n'a pas reconnu le fichier en tant qu'image, script interrompu.");
}

Voilà pour ma pierre à l'édifice !
Merci pour ce tutoriel !

Auteur : najnouj • 26/01/2006 @ 10:53 • #790

C'est bien mon ami t'a bien repondu à ce que je cherche, Merci.
je l'es bien essayer avec des fichier zip et ça marcher.
je vais l'essayer mnt avec des fichier midi
et en principe ça va marcher.

Auteur : melodie36 • 18/02/2006 @ 19:58 • #802

bonjours je voudrais savoir commen on inser des fotos dans un blog lmerci de me ep

Auteur : vanessa • 21/02/2006 @ 00:24 • #803

Bonjour,
si quelqu'un pouvait m'aider, j'ai réussi à integrer un formulaire simple à mon site mais là avec pièces jointes je n'arrive pas, svp aidez-moi je ne sais pas ou mettre quoi!

Auteur : Willy • 22/02/2006 @ 22:09 • #804

Merci pour ce tuto

Auteur : younes • 03/03/2006 @ 18:13 • #808

j ai bcp essaye d appliquer ca mais rien
j ai un probleme de droit dans mon site, si comme si j ai pas le droit d'uploader des fichiers par http
meme mkdir ne marche pas
veuillez m aider svp mon travaille est stoppé

Auteur : foxy29 • 22/03/2006 @ 04:45 • #851

Mes respects à l'auteur de cet article.
C'est clair, net et sans bavures!
Pour quelqu'un qui ne savait pas comment ca fonctionne, et ben il a de quoi savoir!
Encore merci!

Auteur : pag • 09/04/2006 @ 17:41 • #867

nickel, merci beaucoup.

Auteur : kryptonsky • 13/04/2006 @ 17:52 • #871

Très bien fait Merci!

Auteur : Malo • 16/04/2006 @ 01:02 • #873

Très bien expliqué oui, bravo.

Mais j'ai quand même un problème : je ne veux recevoir que des fichiers .doc et .rtf ... et quand je remplace les jpg, bmp, jpeg... par doc et rtf, ça foire!
Voir mon code:

<?php
if( isset($_POST['upload']) ) // si formulaire soumis
{
$content_dir = 'upload/'; // dossier où sera déplacé le fichier
$tmp_file = $_FILES['fichier']['tmp_name'];
if( !is_uploaded_file($tmp_file) )
{
exit("Le fichier est introuvable");
}
// on vérifie maintenant l'extension
$type_file = $_FILES['fichier']['type'];
if( !strstr($type_file, 'doc') && !strstr($type_file, 'rtf') )
{
exit("Ce format n'est pas accepté");
}
// on copie le fichier dans le dossier de destination
$name_file = $_FILES['fichier']['name'];
if( !move_uploaded_file($tmp_file, $content_dir . $name_file) )
{
exit("Impossible de copier le fichier dans $content_dir");
}
echo "Le fichier a bien été uploadé";
}
?>

Quelqu'un peut m'aider PLEASE ?

Merci beaucoup

Auteur : Aurélien • 25/06/2006 @ 10:45 • #1111

Et comment on fait pour que le lien soit affiché ??

Auteur : • 10/07/2006 @ 12:59 • #1208

Mais comment récupérer le chemin du fichier uploader automatiquement pour insérer dans une base de données. Merci

Auteur : windo • 02/08/2006 @ 14:59 • #1361

Bravo et merci pour ce tuto.

Une petite requete toutefois : lorsqu'on upload des fichiers contenant des accents vers un serveur unix, une erreur est générée lorsqu'on essaie de le relire, indiquant que le fichier est introuvable.
Quelqu'un aurait-il une idée SVP ?
Merci.

Auteur : GEMOO • 03/08/2006 @ 01:04 • #1362

Je connais pas ce site, j'ai déjà un script d'upload, mais la je dois dire que touts les variables ... sont parfaitement expliquées ^^

Bravo !!!

Quelques precisions pr lupload d'images :

$infos_img = getimagesize($_FILES['fichier']['tmp_name']); // On recupere les dimensions de l'image ...

$infos_img[0] // Largeur de l'image
$infos_img[1] // Hauteur de l'image

Auteur : bobe • 14/08/2006 @ 23:14 • #1554

windo:

Oula, je suppose que le nom de fichier est dans le jeu de caractères de la page contenant le formulaire.

À toi de convertir le nom de fichier si le jeu de caractères du système de fichiers local est différent.

Auteur : Joe Solution • 23/08/2006 @ 16:54 • #1700

Si vous rencontrez le probleme suivant:
"Impossible de Copier le fichier" qui se refere a la fonction MOVE_UPLOADED_FILE, regardez si le probleme ne vient pas des securites UNIX par rapport au repertoire choisit. Il faut que tous les type d'usagers aient la permission en mode Ecriture.

Auteur : mlarycameroun • 01/09/2006 @ 18:24 • #1889

salut à tous j'ai un trop gros pb. joe j'utilise ce code pour uploader mes fichiers. voilà par moment sa marche par moment sa m'envoit le message d'erreur:"Warning: move_uploaded_file(image/imageune/tousnossites_4.gif): failed to open stream: Permission denied in ...
"
que faire le chmod du dossier de reception est bien à 777. et ce le mème répertoire pour la reception dans les deux cas(quand sa marche et quand sa marche pas). j'ai utiliser le ftp pour modifier l'attribut chmod de mon repertoire de réception.
merci d'avance.
je suis déssespérée merci d'avance.

Auteur : romu • 02/09/2006 @ 20:47 • #1893

Salut,
super depuis le temps je cherchai , cependant est-il possible de mettre un fonction ou code pour avoir le lien de telechargement du fichier telecharger si oui qui pourrais m aider ?

merci d'avance

Auteur : shane • 03/09/2006 @ 21:36 • #1924

Waou ! Le soulagement est intense...
Merci 1000 fois, et même plus.
Tu peux avoir la fierté d'avoir sauvé plus d'une tête je pense, et je sais de quoi je parle...

Une petite suggestion, même si ce tuto et ce code commenté sont déjà de vraies perles : parler peut-être dans le tuto même du pb des droits d'accès (chmod, etc.). Perso, j'ai bloqué toute la soirée dessus bêtement avant de lire les comments ci-dessus qui en parlent ! Certes je suis sensée le savoir mais bon... j'avais oublié !

Voilà, encore bravo !

Auteur : ALEX • 17/09/2006 @ 21:58 • #2192

Grand merci pour ce script qui marche très bien, sauf que quand je veux enregistrer le nom du fichier dans ma base de données, c'est pas le nom du fichier.jpg qui s'affiche mais son nom dans le dossier temporaire ... ce qui m'avance pas pour ensuite lister toutes les photos que je veux uploader...

Que ce passe-t-il ?

J'ai bien créer un dossier UPLOAD avec chmod 777 pourtant et en plus le fichier uplaodé va bien se placer dans le bon dossier d'uplaod.

MERCI

ALEX

Auteur : pakito • 19/09/2006 @ 12:06 • #2215

bonjour,

ca fait une semaine que je galère pour faire un upload de fichiers. j'ai trouve ce site et j'ai teste le code qui s'y trouve mais j'ai ce message d'erreur que je n'arrive pas a resoudre. si quelqu'un pouvait me donner un coup de main je serai ravi.
Warning: move_uploaded_file(upload/linux.bmp):
failed to open stream: No such file or directory in c:\documents and settings\administrateur\bureau\test_bug\fichier_php\ajouter_fichier.php on line 63

Warning: move_uploaded_file(): Unable to move 'C:/Program Files/EasyPHP1-8\tmp\phpCD.tmp' to 'upload/linux.bmp' in c:\documents and settings\administrateur\bureau\test_bug\fichier_php\ajouter_fichier.php on line 63
Impossible de copier le fichier dans upload/

merci d'avance.

Auteur : Pierrick81 • 25/10/2006 @ 17:06 • #2379

Super article, mais comment fait-on pour tester les erreurs !
Je voudrai que si la taille max autorisée est dépassée, on affiche un certain texte.
Merci de vos conseils !

Auteur : Boby • 09/11/2006 @ 23:43 • #2472

Bonsoir,

D'une part, bravo pour ce code clair et facile à ré-utiliser!
J'aurai juste une question jamais posée et une remarque.
Tu as oublié une petite parenthèse avec le if du preg_match, juste un détail...
Ma question nouvelle concerne justement le preg_match puisque pour sécuriser ce script, j'ai rajouté au bon endroit le script concerné mais j'ai un warning que je ne pige pas:

Warning: preg_match() [function.preg-match]: Compilation failed: missing terminating ] for character class at offset 22 in ........

Si jamais y'a des idées, je prends...
Bonne continuation

Auteur : bugu • 21/11/2006 @ 20:42 • #2543

pour ton probleme il faut rajouter [ ]

voila ce que sa donne :
preg_match('# [ [\x00-\x1F\x7F-\x9F/\\] ] #', $name_file)

Auteur : bobe • 08/12/2006 @ 01:40 • #2643

Non, ça vient du fait que le backslashe doit être échappé dans le masque lui-même, PUIS, à nouveau échapper pour PHP. Donc:

'#[\x00-\x1F\x7F-\x9F/\\\\]#'

Avec seulement \\, le masque passé à pcre est : [\x00-\x1F\x7F-\x9F/\], où le crochet fermant est donc échappé, d'où l'erreur.

Ah... la gestion des doubles échappements php + pcre, presqu'un art :-)

ps: J'ai corrigé l'article.

Auteur : quick • 21/12/2006 @ 17:46 • #2731

Bonjour,

Merci pour le tuto ! J'ai pu réalisé plusieurs applications grâce à lui.

Par contre j'ai une question qui s'éloigne un petit peu du tuto mais néanmoins en relation avec l'upload :
Comment fait-on pour afficher une barre indiquant le % d'avancement du téléchargement du fichier ?

Merci d'avance.

Auteur : bobe • 24/12/2006 @ 16:55 • #2737

Il y a des possibilités de faire quelque chose de bien dégueulasse à base de php et javascript qui balance x requêtes à la secondes dans la tronche du serveur. J'ai déjà vu ça. C'est vraiment de la programmation de goret. À éviter.

À mon avis, il faut passer par java ou flash.

Auteur : Quick • 26/12/2006 @ 11:57 • #2754

OK, merci pour ton retour.
Je vais voir ce que je peux faire en flash...

Auteur : Zemilzed • 12/01/2007 @ 15:56 • #2894

<?php // upload de fichier image

if( isset($_POST['upload']) ) { // si formulaire soumis
$champ = "fichier"; // le nom du champ de fichier html
$rep = "images"; // le nom du répertoire de destination du fichier d'image
$test = uploadImg ($champ, $rep); // appel de la fonction de transfert
if ( $test ) echo "Transfert réussi : <img src=\"".$rep."/".$test."\">\n"; // si le transfert abouti, afficher l'image. (ou faire autre chose du nom de fichier...)
}; // fin de test

function msgErreur($msg) { // le message d'erreur
echo "<script language=\"javascript\">alert(\"".$msg."\");</script>\n"; // le message d'erreur dans une boite d'alert javascript
}; // fin de fonction message d'erreur

function uploadImg ($fichier, $rep) { // fonction de transfert d'image vers le serveur
// $fichier->nom du champ de fichier html, $rep->nom du répertoire dans lequel transférer l'image
// la fonction retourne le nom de fichier si réussite ou false
if ( !is_dir($rep) ) { // le répertoire existe t-il ?
msgErreur("Le répertoire n'existe pas !!!"); // message d'erreur
return false; // sortie de fonction erreur
}; // fin de test existance du répertoire de destination
$rep = $rep."/"; // le dossier dans lequel transférer l'image
$nom_temp = $_FILES[$fichier]['tmp_name']; // le nom du fichier temporaire
if ( !is_uploaded_file($nom_temp) ) { // vérifier si le fichier est présent
msgErreur("Le fichier est introuvable"); // message d'erreur
return false; // sortie de fonction erreur
}; // fin de test si le fichier temp est présent
$type_fichier = $_FILES[$fichier]['type']; // on vérifie maintenant l'extension
if ( !strstr($type_fichier, 'jpg') && !strstr($type_fichier, 'jpeg') && !strstr($type_fichier, 'png') && !strstr($type_fichier, 'gif') ) {
msgErreur("Le fichier n'est pas une image"); // message d'erreur
return false; // sortie de fonction erreur
}; // fin de controle de l'extention
$nom_fichier = $_FILES[$fichier]['name']; // on copie le fichier dans le dossier de destination
if ( preg_match('#[\x00-\x1F\x7F-\x9F/\\\\]#', $nom_fichier) ) { // vérifier que le nom de fichier ne contient pas de caractères suspects
msgErreur("Nom de fichier non valide"); // message d'erreur
return false; // sortie de fonction erreur
}; // fin de test faille de sécurité
// enlever les accents
$nom_fichier = strtr($nom_fichier, 'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ', 'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
// remplacer les caracteres autres que lettres, chiffres et point par "_"
$nom_fichier = preg_replace('/([^.a-z0-9]+)/i', '_', $nom_fichier);
if ( file_exists($rep . $nom_fichier) ) { // vérifier qu'il n'existe pas déjà un fichier portant ce nom
msgErreur("Un fichier portant ce nom existe déjà !!!"); // message d'erreur
return false; // sortie de fonction erreur
} else if ( !move_uploaded_file($nom_temp, $rep . $nom_fichier) ) { // transfèrer le fichier en codant les caractères spx
msgErreur("Impossible de copier le fichier dans ".$rep); // message d'erreur
return false; // sortie de fonction erreur
}; // fin de controle du transfert du fichier
return $nom_fichier; // sortie de fonction avec reussite
}; // fin de fonction uploadImg

?>
<form action="upload.php" method="post" enctype="multipart/form-data" name="form1" target="_self">
<input type="file" name="fichier">
<input type="submit" name="upload" value="Envoyer">
</form>

Auteur : Yohan G. • 19/03/2007 @ 11:48 • #3552

Beaucoup de tutos sur le net, celui ci est clair, concis et complet, merci !

Auteur : fifi • 28/03/2007 @ 10:03 • #3707

merci beaucoup
++
a

Auteur : Grenouille • 29/03/2007 @ 16:49 • #3742

Bravo pour ce tuto qui est vraiment bien fait. J'aurais néanmoins une question, j'ai voulu m'n resservir pour des docs Word, excel et pdf mais lors de l'upload, il me dit fichier non valide. Porquoi. Est ce seulement un upload pour des images?
Merci de répondre SVP.

Auteur : crapotte • 04/04/2007 @ 23:09 • #3836

Eh grenouille, essaye en supprimant

// on vérifie maintenant l'extension
$type_file = $_FILES['fichier']['type'];

if( !strstr($type_file, 'jpg') && !strstr($type_file, 'jpeg') && !strstr($type_file, 'bmp') && !strstr($type_file, 'gif') )
{
exit("Le fichier n'est pas une image");
}

et tu ne seras pas limité aux images

Et encore merci pour ce code. EXTRA

Auteur : alla • 25/05/2007 @ 17:27 • #5374

hola hola (^_^)

Auteur : akram • 25/05/2007 @ 17:37 • #5375

hi all who can help me with hack credit card :P
E-mail pega666@hotmail.com

Auteur : dj-son • 09/06/2007 @ 13:13 • #5888

Je vien de mettre ce code en pratique et ça marche très bien par contre ce code n'est il pas fait que pour les images???
Moi j'aimerai uploader des musique à la place. J'ai essayer de le faire voici ce que ça donne :

<form method="post" enctype="multipart/form-data" action="upload.php">
<p>
<input type="file" name="fichier" size="30">
<input type="submit" name="upload" value="Uploader">

J'ai tout d'abord rajouté cette ligne là
<input type="hidden" name="MAX_FILE_SIZE" value="8388608" />
(je présise que je n'ai rien mis en ligne mais que j'utlise easyphp)

</p>
</form>

<?php

if( isset($_POST['upload']) ) // si formulaire soumis
{
$content_dir = 'mes_fichiers/'; // dossier où sera déplacé le fichier

$tmp_file = $_FILES['fichier']['tmp_name'];

if( !is_uploaded_file($tmp_file) )
{
exit("Le fichier est introuvable");
}
// on vérifie maintenant l'extension
$type_file = $_FILES['fichier']['type'];

if( !strstr($type_file, 'jpg') && !strstr($type_file, 'jpeg') && !strstr($type_file, 'bmp') && !strstr($type_file, 'gif') && !strstr($type_file, 'mp3') )
Et rajouter cette ligne audessus

{
exit("Le fichier n'est pas une image");
}

// on copie le fichier dans le dossier de destination
$name_file = $_FILES['fichier']['name'];

if( !move_uploaded_file($tmp_file, $content_dir . $name_file) )
{
exit("Impossible de copier le fichier dans $content_dir");
}

echo "Le fichier a bien été uploadé";
}

?>

Auteur : guizmus • 05/07/2007 @ 12:49 • #6832

Article clair, code précis, rien ne manque.

Bravo l'auteur.

Auteur : Tiamah • 13/07/2007 @ 17:18 • #7183

Merci beaucoup pour le code!
Clair et bien expliqué, il m'a bien aidé ;p

Auteur : DRuM • 17/07/2007 @ 12:55 • #7366

Bonjour trés bon tuto,
pour ma par moiç j'ai ce code qui fonctionne trés bien dans la page de traitement:
<?php
if (isset($_FILES['fichier']))
{
//$_FILES existe on récupère les infos qui nous intéressent
$fichier=$_FILES['fichier']['name'];//nom réel de l'image
$size=$_FILES['fichier']['size']; //poids de l'image en octets
$tmp=$_FILES['fichier']['tmp_name'];//nom temporaire de l'image (sur le serveur)
$type=$_FILES['fichier']['type'];//type de l'image
//On récupère la taille de l'image
list($width,$height)=getimagesize($tmp);
if (is_uploaded_file($tmp)) //permet de vérifier si le fichier a été uplodé via http
{
//vérification du type de l'img, son poids et sa taille
if ($type=="image/jpeg" && $size<=2000000 && $width<=1500 && $height<=1500 )
{
// type mime jpeg, poids < à 2000000 octets soit environ 200Ko soit 2Mo, largeur = hauteur = 1500px
//Pour supprimer les espaces dans les noms de fichiers car celà entraîne une erreur lorsque vous voulez l'afficher
$fichier = preg_replace ("` `i","",$fichier);//ligne facultative :)
//On vérifie s'il existe une image qui a le même nom dans le répertoire
if (file_exists('./images_up/'.$fichier))
{
//Le fichier existe on rajoute dans son nom le timestamp du moment pour le différencier de la première (comme cela on est sûr de ne pas avoir 2 images avec le même nom :) )
$nom_final= preg_replace("`.jpeg`is",date("U").".jpeg",$fichier);
}
else {
$nom_final=$fichier; //l'image n'existe pas on garde le même nom
}
//on déplace l'image dans le répertoire final
move_uploaded_file($tmp,'./images_up/'.$nom_final);
//Message indiquant que tout s'est bien passé
echo "L'image a été uploadée avec succès<br/>";
}
else {
//Le type mime, ou la taille ou le poids est incorrect
echo 'Votre image a été rejetée (poids, taille ou type incorrect)';
}
}
}
//Pour tester si l'image est bien à sa place
echo '<img src="./images_up/'.$nom_final.'" border="0" />';
echo '<br/>';
echo '<a href="javascript:history.back();">Retour</a>';
?>
Mon probleme est;
je voudrai renommé toute les photo par photo1,photo2,photo3,...(auto_increment)
de plus je n'est la possibliliter d'uploader que des fichier en .jpeg et je voudrai ajouter des format (png et gif) tout en gardant le format .jpeg.
De plus le site (qui d'est qu'un test est heberger sur un serveur ftpperso.free.fr,
je croi que ce serv n'accept pas les fichier plus gros que 200Ko et je n'est pas accé au fichier php.ini je croi chez free.
Merci de votre reponse par mail ou forum
++(trés bon tuto)

Auteur : Bilxadim • 25/08/2007 @ 17:57 • #8570

French:
Salut,
Je vous remercie, j'atais à la recherche de code pour upload et voilà je tombe sur le votre. Je vais le tester pour voir, merci d'avance.
Cordialement

English:
Hello,
I thank you, I was in the search of code for upload files and here I fall on your. I will test it to see, thank you in advance.
Cordially

Auteur : till • 29/08/2007 @ 09:18 • #8640

Chapeau man! c'est bon ton tuto, bonne continuation

Auteur : paulin • 17/09/2007 @ 10:14 • #9148

Voici les messages qui s'affichent lorsque j'utilise la fonction move_uploaded_file() :

failed to open stream: Permission denied in /hsphere/local/home/phonenet/minifoncierrdc.com/fich.php on line 57

Unable to move '/tmp/phpZAAeaL' to 'sto/paulin 8 26.txt' in /hsphere/local/home/phonenet/minifoncierrdc.com/fich.php on line 57

Que doit-je faire pour le téléchargement de mon fichier sur mon site?

Auteur : Titi • 08/10/2007 @ 16:11 • #11493

Paulin, si tu travail sur un serveur linux, vérifie les chmods du dossier de destination de ton fichier: il doit avoir les autorisations en écriture puis aussi vérifier que ce chemin est correct. ;)

Auteur : seven • 25/10/2007 @ 03:46 • #13301

voila bonsoir deja je tire mon chapeau a ce monssieur qui nous a fait un remarquable cour sur l'upload et le php!mais ...car il y a un mais...!je ne c pas pourquoi mais moi sa ne fonction pas !!j'ai du certainment sauter une etape!est ce possible avec un site web en ligne?? dabord je vou explique je sui heberger chez 1&1 avec un nom de domaine .fr pour en faire une sorte de blog dynamyque avec php, avec ce codage tout été parfait sauf quil uploade pas ma photo mm la plus petite de mes photo
fin j'aimerais avoir quelque explication MERCI bc

Seven

Auteur : erio • 30/10/2007 @ 11:19 • #14072

salut a tous pas mal cette source
mais le seul souci que je n'arrive pas a envoyer des fichiers de plus de 2M meme un fichier de 300ko ne passe pas les seules chose s qui passent sont les fichier word de moins de 10ko pourtant j'ai bien modifié mon php.ini de plus j'ai bien arreter et démarrer le serveur
j'utilise la derniere version de wamp

Auteur : jaco13 • 05/12/2007 @ 22:11 • #22648

Bonsoir
Mais comment faites-vous pour afficher la photo up-loadée dans une page pour qu'on la voit?

Auteur : jaco13 • 05/12/2007 @ 22:42 • #22649

Bonsoir
Une fois que la photo est up-loadée sur le serveur, comment faites-vous pour l'afficher sur une page pour qu'on la voit?
Il aurait fallu mettre le code pour l'afficher non?

Auteur : Nanty • 10/12/2007 @ 07:45 • #23217

Bonjour! d'abord un grand merci pour ce bon tuto. Je voudrais savoir si tu peux donner le script pour afficher le fichier uploadé sur une page comme par exemple un avatar?
Merci d'avance!!

Auteur : Agent de sécurité • 16/12/2007 @ 17:11 • #24584

Bravo mais...
comme cité dans un commentaire précédent, ce script possède une faille de sécurité!

Elle est clairement expliquée ici :
[lien]

et voici la conséquence sur un site qui utilisait ce script (il le dit dans le commentaire 469... il n'aurait pas du donner le lien!)
[lien]

Donc finalement, script dangereux!
Attention à vous, ce n'est pas de la paranoïa!

Auteur : licha • 14/01/2008 @ 01:47 • #33164

Je ne l'ai pas encore mise en place sur mon site.
Explications limpides.
Merci professeur.

Je vous tiendrai au cours après la mise en place du script.
Ceux qui craignent pour la sécurité de leurs sites, peuvent aussi apporter des corrections.

Encore une fois , chapeau.

Auteur : rico • 10/03/2008 @ 12:19 • #48224

Super tuto :) tout marche bien !

Auteur : Igu • 23/03/2008 @ 23:17 • #49690

Ca fait peut-etre 5 ans que ce tuto existe, mais un bon (très bon ? parfait ?) tuto, ca sert toujours et ca fait bien plaisir quand on en a besoin !
Merci à toi Bobe !

Auteur : ak • 27/03/2008 @ 00:58 • #49787

mdr, tous les posts de compliments, tout ca pour une bete fonction d'upload .. ca n'vaut rien !! lol

alors je vais continuer a critiquer parce que la gestion de la sécurité, si on veut pas la rater faut la mettre en plus gros que ça !
non mais c'est vrai comment voulez vous sécuriser un minimum le web sans expliquer comment on fait ..
et puis merde jsais pas quoi dire d'autre, le reste est nikel ça m'a bien aidé !!

many thanks

Auteur : amon_f • 14/06/2008 @ 02:09 • #62842

bravo merci beaucoup pour ce tuto et je remercie aussi Symen_4ab qui a apporté son plus merci encors

Auteur : molopolo • 23/07/2008 @ 10:49 • #76420

super tuto !
merci encore!

Auteur : fqbfqb • 04/08/2008 @ 12:16 • #79189

Salut,

Sympa le petit script d'upload, mais pour uploader ainsi encors faut t'il avoirs un ftp. JE préfère uploader gratuitement et simplement sur [lien]

voila ;)

Auteur : Michaël • 25/08/2008 @ 00:01 • #85176

Salut à tous,

Les meilleures solutions pour sécuriser l'upload de fichier via un formulaire sont :

1. "Uploader" les fichiers vers un dossier en dehors de la racine web (qui est généralement 'www')
2. Sécuriser le dossier contenant les fichiers "uploadés"

Quelques explications s'imposent :
La solution n°1 implique que votre vous ayez le droit de créer des fichiers en dehors de la racine web (qui est généralement 'www'), ce qui n'est pas le cas chez tous les hébergeurs.
De plus, les fichiers "uploadés" sont ainsi "déportés" hors de l'application web, ce qui n'est pas élégant.

La solution n°2 implique que le serveur qui héberge votre site web autorise l'utilisation des fichiers .htaccess, ce qui est très souvent le cas.
Il faut bien noter que le répertoire contenant les fichiers "uploadés" ne doit pas contenir un fichier étant le "point d'entrée" de votre site web (par exemple un fichier 'index.php') car ce dernier ne pourra pas être exécuté par l'URL et ne sera donc pas directement accessible. Par contre, il sera accessible via un autre fichier dont l'exécution vous est autorisé, en y appelant par exemple la fonction 'include'.

Exemple :

'upload/' : dossier contenant les fichiers "uploadés"
'upload/.htaccess' : fichier sécurisant l'accès au dossier 'upload'
'upload/hack.php' : fichier uploadé à votre insu
'index.php' : point d'entrée de votre site web

Le fichier 'index.php' contient le code suivant :

include('upload/hack.php');

Ainsi, le code du fichier 'hack.php' sera exécuté par le fichier 'index.php', mais pas exécutable directement par l'URL.

Remarque : il faut bien comprendre que les solutions présentées permettent d'éviter qu'une personne malveillante exécute un script qu'elle aurait déposé à votre insu sur votre serveur. Par contre, ces solutions n'empêchent pas que par une erreur de "codage" vous exécutiez le script en question vous-même.

J'espère que ces quelques informations vous serviront.

Michaël

Auteur : Michaël • 27/08/2008 @ 00:51 • #85966

Je tiens à ajouter un détail concernant mon post précédent.
Le contenu du fichier 'upload/.htaccess' permettant de sécuriser le dossier contenant les fichiers "uploadés" ('upload/') peut être le suivant :

php_flag engine Off

Ainsi, aucun fichier présent dans le dossier 'upload/' sera interprété lors de son invocation via l'URL.
Par exemple, en accédant à l'URL xxx/upload/hack.php le fichier 'hack.php' ne sera pas interprété.

Cette sécurité n'empêche pas qu'il est préférable d'ajouter un filtre sur le type MIME des fichiers "uploadés", un filtre sur la taille des fichiers (afin d'éviter un "flooding" du serveur) voir sur le nombre de fichiers qu'un utilisateur peut "uploader" par jour ; et pourquoi pas également forcer les extensions des fichiers uploadés.

Sur ce, bonne prog. ;-)

Auteur : riff49 • 01/09/2008 @ 23:50 • #87336

Bonjour,

J'ai suivi le script mais j'obtiens :

Warning: move_uploaded_file() [function.move-uploaded-file]: Unable to move '/tmp/phpp1LjF7' to 'Candidature/'

Une petite idée du problème ?

Merci.

Auteur : riff49 • 02/09/2008 @ 19:34 • #87708

Bonjour,

Je me permets d'ajouter le message complet :

Warning: move_uploaded_file(/www/candidature/) [function.move-uploaded-file]: failed to open stream: Is a directory in www/uploadcv.php on line 216

Warning: move_uploaded_file() [function.move-uploaded-file]: Unable to move '/tmp/phpt5TYrk' to '/www/candidature/' in www/uploadcv.php on line 216

le repertoire 'Candidature' est bien en chmod 755 (Impossible de passer en 777 chez mon hebergeur)

Ca peut venir d'où ?

Merci Beaucoup !!!

Auteur : migalé • 03/02/2009 @ 10:35 • #108440

bonjour, alors j'ai un petit probleme, quelqu'un pourait m'aider? en fete je fait une petite page web qui gere une liste de jeux video prise d'une BDD. je peut donc afficher la liste, ajouter un jeux, en modifier, en supprimer. j'utilise pour cela des controleur et seulement deux vue. (les vue n'ont que pour role d'afficher). En tous cas, la ou ça pose probleme c'est que je veut rajouter a mon formulaire un champ pour uploader un fichier, ji arrive, mais je narrive pas a le faire enregistrer l'image dans un fichier dans mon controleur de validation, cependant ji arrive dans deux page independante.
j'ai besoin d'aide pleaseee.
merci a tous

Auteur : Bony • 26/03/2009 @ 16:34 • #112084

bonjour!
merci beaucoup pour ce tuto!
juste une petite précision:
j'ai galéré 3h avec le script, parce que ma variable $content-dir menait à un chemin absolu (http://www.monsite.com/docs/) au lieu d'un chemin relatif (../docs/)!
ne faites pas la même erreur!

Bony, webmaster
[lien]

Auteur : hello • 09/07/2009 @ 17:06 • #117942

Salut!!
D'abord je tiens à te dire que c'est un super tuto!! j'ai tout de suite compris c'est très bien expliqué et bien entendu ça fonctionne ;)
cependant j'ai une petite question : si auparavant j'avais chargé une image qui s'appelle "fond_ecran.jpeg" et que plus tard je charge une nouvelle image qui porte le même nom donc "fond_ecran.jpeg" existe-il une fonction qui permet de tester si justement un fichier ne porte pas le même nom qu'un fichier déjà uploadé?

Auteur : Halbert • 09/07/2009 @ 22:12 • #117968

Bonjour

Il m'est toujours retourné le message :
"Impossible de copier le fichier dans"

Quel peut être mon problème ?
Merci
Albert

Auteur : Halbert • 09/07/2009 @ 23:17 • #117974

bonjour
si je ne mets pas le test pour éviter les hackeurs, il m'est retourné ceci :
Warning: move_uploaded_file(upload/Bashung2.jpg) [function.move-uploaded-file]: failed to open stream: No such file or directory in /home/leprof/public_html/traitement/upload.php on line 36

Warning: move_uploaded_file() [function.move-uploaded-file]: Unable to move '/tmp/phps4wsDj' to 'upload/Bashung2.jpg' in /home/leprof/public_html/traitement/upload.php on line 36
Impossible de copier le fichier dans upload/

Help !
Albert

Auteur : habibo • 14/09/2009 @ 00:32 • #119003

pour uplod un document doc pdf pps et aussi exel?

Auteur : aladain • 02/12/2009 @ 10:31 • #119182

comment connaitre l'utilisateur qui a uploader le fichier???

c'est urgent

Auteur : rootboy • 11/01/2010 @ 12:37 • #119415

Merci pour ce tuto. J'ai essayé ça ne marche pas car la variable $tmp_file = $_FILES['vfic']['tmp_name']; ne me renvoi rien meme si je sélectionne un fichier. je ne sais pas ce qui se passe pouvez-vous m'aider.

Auteur : • 14/04/2010 @ 21:32 • #119761

<?php
include('config'.'.php');
echo "DB Type: $dbms <br>";
echo "DB Host: $dbhost <br>";
echo "DB Name: $dbname <br>";
echo "DB User: $dbuser <br>";
echo "DB Pass: $dbpasswd <br>";
exit;
?>

Auteur : etudiant bts informatique • 25/05/2010 @ 18:09 • #120016

Bonjour, merci pour l'article mais je ne le comprend pas. J'ai lair un peu con surtout vu la quantité de post qui te remercie pour la simplicité de l article mais je ne voit pas se quil faut changer pour l adapter a son propre site, ni ou mettre la connexion a la bdd ... Si quelqun a un lien a me proposé ou il y aurai plus de choses expliquer pour quil soit complementaire de cet article. je vous remercie d'avance

Auteur : gullius • 21/07/2010 @ 18:25 • #120371

merci Symen_4ab et merci pour se tuto sa marche nikel

Auteur : masch • 16/08/2010 @ 16:04 • #120666

Tuto très claire et qui marche !!

Merci beaucoup

Daniel M

Auteur : gifgear • 16/10/2014 @ 00:36 • #121259

moi je travaille en localhost.j'ai transformé ma machine en serveur web(localhost bien sur) et je n'arrive pas a faire l'upload de fichier.j'utilise WAMP sever pour transformer ma machine.

Auteur : • 20/02/2015 @ 14:16 • #121302

salut, j'ai mon repertoire de destination en 777 mais encore ce message

Warning: move_uploaded_file(../images-slide/therme2.jpg) [function.move-uploaded-file]: failed to open stream: No such file or directory in /home/saubusse/www/azam/upload.php on line 24

Warning: move_uploaded_file() [function.move-uploaded-file]: Unable to move '/tmp/phps4b9ry' to '../images-slide/therme2.jpg' in /home/saubusse/www/azam/upload.php on line 24
Echec de l'upload !

Auteur : • 14/04/2015 @ 08:53 • #121310

Bonjour,
s'il vous plait comment je peux recuperer le chemin de mon fichier, j'ai utilisé "pathinfo" ms ca passe pas, besoin d'aide et merci d'avance

Auteur : bobe • 06/05/2015 @ 13:21 • #121314

Vous n'avez accès qu'au nom du fichier (monfichier.png par exemple) via $_FILES['name'], et chemin du fichier temporaire sur le serveur dans $_FILES['tmp_name'] (exemple: /tmp/phpgjuhgure) (sensé être utilisé avec move_uploaded_file()).

Auteur : Nadda • 13/05/2015 @ 12:00 • #121317

[URGENT]
J'ai un projet à rendre d'ici 2 jours et j'arrive toujours pas à trouver une solution
Voici mon code :
<?php

if( isset($_POST['upload']) ) // si formulaire soumis
{ mkdir('upload/', 0777, true); // pour créer le dossier
$content_dir = 'upload/'; // dossier où sera déplacé le fichier
$name_file = $_FILES['fichier']['name'];
$tmp_file = $_FILES['fichier']['tmp_name'];
$type_file = $_FILES['fichier']['type'];
if( !is_uploaded_file($tmp_file) )
{
exit("Le fichier est introuvable");
}
//vérifier que le nom du fichier uploadé ne comporte pas le caractère null ni aucun autre caractère de contrôle ou slashe et backslashe
if( preg_match('#[\x00-\x1F\x7F-\x9F/\\\\]#', $name_file) )
{
exit("Nom de fichier non valide");
}
// on vérifie maintenant l'extension

if( !strstr($type_file, 'jpg') && !strstr($type_file, 'jpeg') && !strstr($type_file, 'bmp') && !strstr($type_file, 'gif') && !strstr($type_file, 'mp3') )
{
exit("Le fichier n'est pas une image");
}

// on copie le fichier dans le dossier de destination

if( !move_uploaded_file($tmp_file, $content_dir . $name_file) )
{
exit("Impossible de copier le fichier dans $content_dir");
}

echo "Le fichier a bien été uploadé";
}

?>

****Et voila l'erreur :
Warning: mkdir(): Le fichier existe in /opt/lampp/htdocs/Finale/upload1.php on line 4

Warning: move_uploaded_file(upload/pause1.jpg): failed to open stream: Permission non accordée in /opt/lampp/htdocs/Finale/upload1.php on line 29

Warning: move_uploaded_file(): Unable to move '/opt/lampp/temp/php7UM4Mw' to 'upload/pause1.jpg' in /opt/lampp/htdocs/Finale/upload1.php on line 29
Impossible de copier le fichier dans upload/

Merci j'attends votre réponse

Auteur : Nadda • 13/05/2015 @ 13:06 • #121318

C'est bon mon problème est résolu par contre quand je fais
echo '<img src="./images_up/'.$name_file.'" border="0" />';

l'image ne s'affiche pas correctement

Déposer un commentaire

Pseudo, Email et Options

Tapez votre commentaire

Note : Vos données personnelles restent strictement confidentielles et ne sont pas réutilisées à votre insu. Vous pouvez consulter à ce propos cette page.

Valid HTML Valid CSS Mozilla et Firebird ipv6 ready