Input file
Fermé
helpme
-
2 oct. 2014 à 17:18
Pitet Messages postés 2826 Date d'inscription lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022 - 6 oct. 2014 à 11:50
Pitet Messages postés 2826 Date d'inscription lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022 - 6 oct. 2014 à 11:50
A voir également:
- Input file
- Host file - Guide
- .Bin file - Guide
- .Dat file - Guide
- Iso file - Guide
- Swf file player - Télécharger - Lecture
18 réponses
trop de littérature , le probleme est incomprehensible
insere du code et dis ce que tu veux faire...
insere du code et dis ce que tu veux faire...
Désolé ^^
EN gros je veux récupérer les informations d'un fichier avec $_FILES comme ceci : $filename = $_FILES['file']['name'];
Mais ça me met que la variable est inconnu, alors qu'elle marche pourtant bien lorsque je la formule comme ceci :$filename = $_POST['file'];
Ensuite j'aimerais récupérer l'image uploadé dans un fichier comme ceci : mkdir('../uploads/',0777,true);
Sauf que la ça ne marche pas.
j'espère que c'est plus lisible et compréhensible comme ceci.
EN gros je veux récupérer les informations d'un fichier avec $_FILES comme ceci : $filename = $_FILES['file']['name'];
Mais ça me met que la variable est inconnu, alors qu'elle marche pourtant bien lorsque je la formule comme ceci :$filename = $_POST['file'];
Ensuite j'aimerais récupérer l'image uploadé dans un fichier comme ceci : mkdir('../uploads/',0777,true);
Sauf que la ça ne marche pas.
j'espère que c'est plus lisible et compréhensible comme ceci.
Pitet
Messages postés
2826
Date d'inscription
lundi 11 février 2013
Statut
Membre
Dernière intervention
21 juillet 2022
525
3 oct. 2014 à 11:20
3 oct. 2014 à 11:20
Salut,
Tu dois utiliser un input de type file :
Puis pour le récupérer en php :
Il faut ensuite utiliser la fonction move_uploaded_file() pour copier le fichier temporaire dans ton dossier upload (cf exemples de la doc : https://www.php.net/manual/fr/features.file-upload.post-method.php
Bonne journée
Tu dois utiliser un input de type file :
<input type="file" name="monfichier" />
Puis pour le récupérer en php :
// le nom du fichier sur l'ordinateur de l'internaute $nomOriginal = $_FILE['monfichier']['name']; // nom du fichier uploadé dans le dossier temporaire $nomTemporaire = $_FILE['monfichier']['tmp_name'];
Il faut ensuite utiliser la fonction move_uploaded_file() pour copier le fichier temporaire dans ton dossier upload (cf exemples de la doc : https://www.php.net/manual/fr/features.file-upload.post-method.php
Bonne journée
Pitet
Messages postés
2826
Date d'inscription
lundi 11 février 2013
Statut
Membre
Dernière intervention
21 juillet 2022
525
3 oct. 2014 à 14:54
3 oct. 2014 à 14:54
Edit : $_FILES et non $_FILE
Merci pour ta réponse mais c'est bien ce que j'ai fais
j'ai comme input file : <input type="file" name="file"/>
et si j'envoi:
$filename = $_FILE['file']['name']; pour enregistrer le nom en bdd ce n'est pas bon il ne se passe bien ... et je n'arrive vraiment pas à voir ou ça déconne
<input type="file" name="file"/> est dans une page standard et j 'exécute le reste dans une autre page que voici :
<?php
class Insertion
{
public $title;
public $content;
public $region;
public $category;
public $file;
public function Envoi ($title,$content,$region,$category,$file)
{
include('../database/database.php');
$this->title = htmlentities($_POST["title"], ENT_QUOTES);
$this->content = htmlentities($_POST["content"], ENT_QUOTES);
$this->region = htmlentities($_POST["region"], ENT_QUOTES);
$this->category = htmlentities($_POST["cat"], ENT_QUOTES);
$this->file = htmlentities($_POST["file"], ENT_QUOTES);
$login = "test";
$filename = $_FILE['monfichier']['name'];
$destination = '../upload/test';
if(strlen($title) < 2 || strlen($title) > 10 || strlen($content) < 10 || strlen($content) > 500){
alert('fail');
}
else {
$req = $bdd->prepare('INSERT INTO vente(login_user,title,content,region,category,file,date) VALUES (:login_user,:title,:content,:region,:category,:file,now())');
$req->execute(array('login_user'=>$login,'title'=>$title,'content'=>$content,'region'=>$region,'category'=>$category,'file'=>$filename));
header('location: don.php');
}
}
}
$insertion = new insertion();
$insertion->Envoi($_POST['title'],$_POST['content'], $_POST['region'],$_POST['cat'],$filename);
?>
j'ai comme input file : <input type="file" name="file"/>
et si j'envoi:
$filename = $_FILE['file']['name']; pour enregistrer le nom en bdd ce n'est pas bon il ne se passe bien ... et je n'arrive vraiment pas à voir ou ça déconne
<input type="file" name="file"/> est dans une page standard et j 'exécute le reste dans une autre page que voici :
<?php
class Insertion
{
public $title;
public $content;
public $region;
public $category;
public $file;
public function Envoi ($title,$content,$region,$category,$file)
{
include('../database/database.php');
$this->title = htmlentities($_POST["title"], ENT_QUOTES);
$this->content = htmlentities($_POST["content"], ENT_QUOTES);
$this->region = htmlentities($_POST["region"], ENT_QUOTES);
$this->category = htmlentities($_POST["cat"], ENT_QUOTES);
$this->file = htmlentities($_POST["file"], ENT_QUOTES);
$login = "test";
$filename = $_FILE['monfichier']['name'];
$destination = '../upload/test';
if(strlen($title) < 2 || strlen($title) > 10 || strlen($content) < 10 || strlen($content) > 500){
alert('fail');
}
else {
$req = $bdd->prepare('INSERT INTO vente(login_user,title,content,region,category,file,date) VALUES (:login_user,:title,:content,:region,:category,:file,now())');
$req->execute(array('login_user'=>$login,'title'=>$title,'content'=>$content,'region'=>$region,'category'=>$category,'file'=>$filename));
header('location: don.php');
}
}
}
$insertion = new insertion();
$insertion->Envoi($_POST['title'],$_POST['content'], $_POST['region'],$_POST['cat'],$filename);
?>
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Reivax962
Messages postés
3672
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
11 février 2021
1 011
3 oct. 2014 à 14:00
3 oct. 2014 à 14:00
Bonjour,
Pour savoir exactement ce que contient le tableau $_FILE, tu peux mettre sur ta page :
Ça te donnera un affichage de toutes les valeurs de ce tableau, et ça te permettra sans doute de comprendre ce qui ne va pas.
Xavier
Pour savoir exactement ce que contient le tableau $_FILE, tu peux mettre sur ta page :
echo '<pre>'; var_dump($_FILE); echo '</pre>';
Ça te donnera un affichage de toutes les valeurs de ce tableau, et ça te permettra sans doute de comprendre ce qui ne va pas.
Xavier
Pitet
Messages postés
2826
Date d'inscription
lundi 11 février 2013
Statut
Membre
Dernière intervention
21 juillet 2022
525
Modifié par Pitet le 3/10/2014 à 14:54
Modifié par Pitet le 3/10/2014 à 14:54
Si ton input a pour attribut name="file", tu dois alors y accéder en php via :
Le nom réel du fichier uploadé sur ton serveur se récupère via :
Tu DOIS utiliser la fonction move_uploaded_file() pour déplacer ton fichier temporaire, sinon ton fichier sera supprimé à la fin de ton script.
Pour t'aider, regarde la doc : https://www.php.net/manual/fr/features.file-upload.post-method.php
(les exemples sont assez parlants)
PS HS : htmlentities avant l'insertion en bdd est une mauvaise pratique. A utiliser lors de l'affichage.
Edit corresction : tableau $_FILES et non $_FILE
$_FILES['file'] // pas $_FILES['monfichier']
Le nom réel du fichier uploadé sur ton serveur se récupère via :
$fichierTemp = $_FILES['file']['tmp_name'];
Tu DOIS utiliser la fonction move_uploaded_file() pour déplacer ton fichier temporaire, sinon ton fichier sera supprimé à la fin de ton script.
Pour t'aider, regarde la doc : https://www.php.net/manual/fr/features.file-upload.post-method.php
(les exemples sont assez parlants)
PS HS : htmlentities avant l'insertion en bdd est une mauvaise pratique. A utiliser lors de l'affichage.
Edit corresction : tableau $_FILES et non $_FILE
Encore merci pour vos réponses.
J'ai regardé la doc et fais des changements mais rien n'y fait.
Au fait ce n'est pas $_FILES au lieu de $_FILE ?
donc la l'input a bien le name file :
<input type="file" name="file" />
et la(j'ai essayé $_FILE et $_FILES, mais il me mettent que $_FILE est inconnu),dans $_FILES je récupère en premiere valeur le name de mon input donc "file" puis je veux son nom donc en deuxieme valeur "name".
J'ai fais le var_dump de $_FILES maus ça me retourne un tableau vide je n'arrive vraiment pas à comprendre pourquoi
$login = "test";
//$filename = $_POST['file'];
$filename = $_FILES['file']['name'];
$dest = '../upload';
$req = $bdd->prepare('INSERT INTO vente(login_user,title,content,region,category,file,date) VALUES (:login_user,:title,:content,:region,:category,:file,now())');
$req->execute(array('login_user'=>$login,'title'=>$title,'content'=>$content,'region'=>$region,'category'=>$category,'file'=>$filename));
move_uploaded_file($filename, $dest);
var_dump($_FILES);
J'ai regardé la doc et fais des changements mais rien n'y fait.
Au fait ce n'est pas $_FILES au lieu de $_FILE ?
donc la l'input a bien le name file :
<input type="file" name="file" />
et la(j'ai essayé $_FILE et $_FILES, mais il me mettent que $_FILE est inconnu),dans $_FILES je récupère en premiere valeur le name de mon input donc "file" puis je veux son nom donc en deuxieme valeur "name".
J'ai fais le var_dump de $_FILES maus ça me retourne un tableau vide je n'arrive vraiment pas à comprendre pourquoi
$login = "test";
//$filename = $_POST['file'];
$filename = $_FILES['file']['name'];
$dest = '../upload';
$req = $bdd->prepare('INSERT INTO vente(login_user,title,content,region,category,file,date) VALUES (:login_user,:title,:content,:region,:category,:file,now())');
$req->execute(array('login_user'=>$login,'title'=>$title,'content'=>$content,'region'=>$region,'category'=>$category,'file'=>$filename));
move_uploaded_file($filename, $dest);
var_dump($_FILES);
Pitet
Messages postés
2826
Date d'inscription
lundi 11 février 2013
Statut
Membre
Dernière intervention
21 juillet 2022
525
3 oct. 2014 à 14:53
3 oct. 2014 à 14:53
Effectivement il s'agit bien de $_FILES et non $_FILE, belle coquille de ma part.
Il faut aussi ajouter l'attribut enctype sur ta balise form pour l'upload de fichier, on l'oublie facilement :
Il faut aussi ajouter l'attribut enctype sur ta balise form pour l'upload de fichier, on l'oublie facilement :
<form action="_URL_" method="post" enctype="multipart/form-data">
Un peu mieux, depuis l'enctype le var dump de $_FILES me récupère bien des infos, par contre le $filename et l index file sont "pas défini"... pourtant comme vous pouvez le voir je les ai bien défini
Pitet
Messages postés
2826
Date d'inscription
lundi 11 février 2013
Statut
Membre
Dernière intervention
21 juillet 2022
525
3 oct. 2014 à 15:14
3 oct. 2014 à 15:14
Essaye ceci :
Le message 'Le fichier est valide' est-il affiché ?
Sinon, montre nous ce qu'affiche le var_dump($_FILES);
$uploaddir = '../upload/'; $uploadfile = $uploaddir . basename($_FILES['file']['name']); if (move_uploaded_file($_FILES['file']['tmp_name'], $uploadfile)) { echo 'Le fichier est valide, et a été téléchargé.'; } else { echo 'Attaque potentielle par téléchargement de fichiers.'; } echo '<pre>'; echo 'Voici quelques informations de débogage :'; var_dump($_FILES); echo '</pre>';
Le message 'Le fichier est valide' est-il affiché ?
Sinon, montre nous ce qu'affiche le var_dump($_FILES);
oui c est bien le message affiché ! et l'image a bien été uploadée dans mon dossier, le var dump retourne exactement les bonnes info, merci beaucoup ça m'aide à comprendre
edit : du coup maintenant le $filename s'insert bien en bdd, mais il me laisse quand meme le message non défini...
edit : du coup maintenant le $filename s'insert bien en bdd, mais il me laisse quand meme le message non défini...
Pitet
Messages postés
2826
Date d'inscription
lundi 11 février 2013
Statut
Membre
Dernière intervention
21 juillet 2022
525
3 oct. 2014 à 15:39
3 oct. 2014 à 15:39
Quel est le message d'erreur complet et le code auquel il fait référence ?
C'est bon j'ai réussi a faire autrement merci, j'ai enlever $filename et je le rajoute dans la bdd directement dans le prepare/execute, et plus aucuns message d'erreurs maintenant !
Maintenant j'ai un nouveau petit soucis, désolé ça s'accumule ^^, j'essaie d'afficher des articles, qui marchent correctement, mais maintenant que j'arrive a uploader les images j'aimerais afficher ces images.
J'affiche les informations dans un foreach, et pour l'image j'ai fais comme ceci :
"<img src=../upload/'.$donnees->file, 'picture'"
$donnees->file permet dans la foreach d'afficher chaque image présente dans ma bdd, et la balise img pour afficher l'image qui est stoké dans le dossier../ upload
edit : désolé j'ai meme pas précise l'erreur... Notice: Trying to get property of non-object
Maintenant j'ai un nouveau petit soucis, désolé ça s'accumule ^^, j'essaie d'afficher des articles, qui marchent correctement, mais maintenant que j'arrive a uploader les images j'aimerais afficher ces images.
J'affiche les informations dans un foreach, et pour l'image j'ai fais comme ceci :
"<img src=../upload/'.$donnees->file, 'picture'"
$donnees->file permet dans la foreach d'afficher chaque image présente dans ma bdd, et la balise img pour afficher l'image qui est stoké dans le dossier../ upload
edit : désolé j'ai meme pas précise l'erreur... Notice: Trying to get property of non-object
Pitet
Messages postés
2826
Date d'inscription
lundi 11 février 2013
Statut
Membre
Dernière intervention
21 juillet 2022
525
3 oct. 2014 à 16:07
3 oct. 2014 à 16:07
Ton erreur indique que tu essayes d'accéder à une propriété d'un objet sur une variable qui n'est pas un objet.
Je suppose qu'il s'agit de la variable $donnees. Es tu sur que celle-ci est bien initialisée ? Montre nous le code de ta boucle sinon.
Je suppose qu'il s'agit de la variable $donnees. Es tu sur que celle-ci est bien initialisée ? Montre nous le code de ta boucle sinon.
désolé jfais n'importe quoi c'est pas données->info mais données['info']
Soucis résolu encore merci !
Soucis résolu encore merci !
Pitet
Messages postés
2826
Date d'inscription
lundi 11 février 2013
Statut
Membre
Dernière intervention
21 juillet 2022
525
3 oct. 2014 à 16:57
3 oct. 2014 à 16:57
Essaye de nous montrer des extraits de code un peu plus complet, difficile de voir tes erreurs avec juste un bout de chaine de caractères.
En version php :
En version html+php :
Tu peux noter l'utilisation de htmlentities lors de l'affichage de la donnée dans une page html, il ne faut pas faire un htmlentities avant l'insertion en bdd.
Vérifier également que ton document est bien encodé en utf-8 ou changer/supprimer le 3e paramètre de la fonction si ce n'est pas le cas.
En version php :
echo '<img src="../upload/' . htmlentities($donnees['file'], ENT_QUOTES, 'UTF-8') . '" />'
En version html+php :
<img src="../upload/<?php echo htmlentities($donnees['file'], ENT_QUOTES, 'UTF-8'); ?>" />
Tu peux noter l'utilisation de htmlentities lors de l'affichage de la donnée dans une page html, il ne faut pas faire un htmlentities avant l'insertion en bdd.
Vérifier également que ton document est bien encodé en utf-8 ou changer/supprimer le 3e paramètre de la fonction si ce n'est pas le cas.
merci pour les conseils !
en quoi est ce genant d utiliser htmlentites avant l insertion en bdd ? faut t il le remplacer par autre chose ou juste ne rien mettre ?
en quoi est ce genant d utiliser htmlentites avant l insertion en bdd ? faut t il le remplacer par autre chose ou juste ne rien mettre ?
Pitet
Messages postés
2826
Date d'inscription
lundi 11 février 2013
Statut
Membre
Dernière intervention
21 juillet 2022
525
Modifié par Pitet le 6/10/2014 à 11:50
Modifié par Pitet le 6/10/2014 à 11:50
C'est génant car tu insères des entités html en bdd alors que ces données peuvent être utilisées pour autre chose qu'un affichage dans un document html.
Si tu veux utiliser ces données pour générer un résultat dans un autre format (par exemple en json pour faire de l'ajax, en pdf pour proposer de le télécharger, en csv pour l'importer dans une autre appli, etc...), les entités html seront inutiles et pourront même poser certains problèmes.
Il faut protéger ses données en fonction de leur utilisation :
- insertion en bdd -> requête préparée pour éviter les injections sql
- dans un doc html -> htmlentities pour éviter les failles xss
- dans un doc json -> jsonencode
- dans une url -> urlencode
- ...
Bonne journée
Si tu veux utiliser ces données pour générer un résultat dans un autre format (par exemple en json pour faire de l'ajax, en pdf pour proposer de le télécharger, en csv pour l'importer dans une autre appli, etc...), les entités html seront inutiles et pourront même poser certains problèmes.
Il faut protéger ses données en fonction de leur utilisation :
- insertion en bdd -> requête préparée pour éviter les injections sql
- dans un doc html -> htmlentities pour éviter les failles xss
- dans un doc json -> jsonencode
- dans une url -> urlencode
- ...
Bonne journée