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
Bonjour j'ai un input file qui me pose quelques soucis...
Tout d'abord j'ai récupéré son nom comme ceci : $filename = $_POST['file'];
ca m'insere directement le nom en bdd.
Mais j'ai vu une autre maniere de faire :$filename = $_FILES['file']['name'];, malheureusement ça ne marche pas et j'aimerais comprendre pourquoi, mon fichier a bien le name "file" et je veux récupérer son nom. Ca me met comme message que la variable $filename est inconnu lorsque je procède comme ça, pourtant il la comprend correctement quand je le fais avec $_POST.
Ensuite j'aimerais récupérer l'image upload dans un fichier comme ceci : mkdir('../uploads/',0777,true);, donc le dossier se crée mais je n'arrive pas à récupérer l'image... si je met l'image($_POST['file']) après '../uploads/', c'est un dossier qui se crée, et si je concatène rien ne se passe...
C'est assez urgent, merci à ceux qui pourront m'aider !
A voir également:

18 réponses

trop de littérature , le probleme est incomprehensible

insere du code et dis ce que tu veux faire...
0
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.
0
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
Salut,

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
0
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
Edit : $_FILES et non $_FILE
0
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);
?>
0

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
Bonjour,

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
0
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
Si ton input a pour attribut name="file", tu dois alors y accéder en php via :
$_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
0
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);
0
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
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 :
<form action="_URL_" method="post" enctype="multipart/form-data">
0
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
0
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
Essaye ceci :
$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);
0
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...
0
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
Quel est le message d'erreur complet et le code auquel il fait référence ?
0
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
0
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
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.
0
désolé jfais n'importe quoi c'est pas données->info mais données['info']

Soucis résolu encore merci !
0
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
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 :
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.
0
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 ?
0
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
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
0