Problème vardump($_files) marche pas

Par Belekos, il y a 8 ans


Bonjour,

Voila je rencontre un problème avec mon code, je cherche à récupérer le contenu de mon input files et je ne comprends pas pourquoi je n'arrive pas à l'afficher avec le vardump($_files) alors que le vardump($_post) fonctionne bien pour les variables post...

<form action="<?= $site->url ?>/devis-rapide" id="invoiceGold" method="POST" role="form" enctype="multipart/form-data"> <div class="form-group"> <textarea name="devis" id="input_freelance" class="form-control" rows="7" required placeholder="Merci de nous décrire votre demande dans ce champ de texte"></textarea> </div> <div class="form-group"> <label for="zip_rapide">Fichiers au format zip</label> <input type="file" id="image" name="image"/> <input type="hidden" name="MAX_FILE_SIZE" value="1048576" /> <p class="help-block">Merci de sélectionner vos fichiers et de nous les envoyés compréssés</p> </div> <hr> <button type="submit" class="btn btn-primary">Envoyer la demande</button> </form> public function needGoldInvoice($req, $res, $args){ print_r($_POST); // fonctionne bien print_r($_FILES); // Ne fonctionne pas }

Je suis perdu, si quelqu'un à la solution ca m'aiderai énormément, merci beaucoup

22 réponses

betaWeb, il y a 8 ans

Salut,

Tu utilises print_r et non var_dump, donc commence par essayer avec la function var_dump().

Ensuite, sur quelle version de PHP es-tu ?

Belekos, il y a 8 ans

Les deux ne fonctionnent pas j'ai essayer print_r après avoir essayer le var_dump.
Je suis en php 5.6

betaWeb, il y a 8 ans

Il y a une GROSSE DIFFERENCE entre "ne marche pas" et "n'affiche rien" : lequel est-ce ?

Belekos, il y a 8 ans

les deux m'affichent la meme chose : "array(0) { }" et quand je cible mon input en faisant var_dump($_files['monInput']) ca m'affiche "Null"

je vous montre aussi mon fichier js avec la fonction ajax ( en fait le formulaire est dans une popup ) :

$('form#invoiceGold').submit(function(event) { event.preventDefault(); var $form = $(this); var $status = $('#upload-status-imp-rapide'); $.post($form.attr('action'), $form.serializeArray()) .done(function(data, text, jqxhr){ $('#rapide-container').find('form').html(' '); $status.css('display', 'block'); $status.removeAttr('class').attr('class', 'alert alert-success'); $status.html(data); $('#close-imp').css('display', 'block').css('margin', '0 auto').css('margin-top', '15px'); }).fail(function(jqxhr){ swal("Oops...", "Merci de contacter le support", "error"); $status.css('display', 'block'); $status.removeAttr('class').attr('class', 'alert alert-danger'); $status.html(err.responseText); }); });

Voici aussi la route ( on utilise slim framework )

$app->post('/mdp', 'Auth:mdpLost');
betaWeb, il y a 8 ans

Si tu utilises Slim, pourquoi ne passes-tu pas tout simplement par le paramètre $request pour récupérer les infos de ta requête (cf la doc) ?

Belekos, il y a 8 ans

Comment exactement ? j'essaye de faire un $req->isPost et de mettre mon var_dump dedans mais ca ne fonctionne pas.

if($req->isPost()) { var_dump($_FILES); } else { echo 'no'; }
betaWeb, il y a 8 ans

Quelle version de Slim utilises-tu ?

Belekos, il y a 8 ans

Il me semble que c'est la version 3

betaWeb, il y a 8 ans

Tu as regardé le tutoriel consacré à Slim v3 ?

Et regarde la documentation : en cherchant 20 s (top chrono !), j'ai trouvé ceci : $files = $request->getUploadedFiles();, rien de plus simple ... ;)

Belekos, il y a 8 ans

Je ne connaissais pas cette fonction mais après utilisation elle me retourne : "array".
Je pense que le var_dump($_files) aurait du fonctionner malgré tout je n'arrive pas à comprendre pourquoi ca ne marche pas...

ps: merci encore de ton aide ;)

betaWeb, il y a 8 ans

Oui, elle te retourne un array contenant ton/tes fichier(s).
Je pense que Slim doit override le comportement de certains éléments natifs de PHP. Utilise la doc, elle répondra à tes questions ;)
Pense à passer ton sujet à résolu ;)

Belekos, il y a 8 ans

Oui mais comment faire pour les voirs et pour les récupérés ?

Belekos, il y a 8 ans

Si je fais un var_dump dessus j'ai toujours un array 0, je ne pense pas que le sujet soit résolus

betaWeb, il y a 8 ans

Ah beh c'est que tu ne récupères pas de fichiers tout simplement ;)
Tu es sur quel env de dev ?

Belekos, il y a 8 ans

Oui je sais ^^ mais je n'arrive pas à voir pourquoi ... au vu de mon code ca devrait etre bon non ?
Je suis sur sublim text 3 pourquoi ? (j'ai phpstorm sur mon pc dont je n'ai pas eu le temps d'apprendre à me servir)

betaWeb, il y a 8 ans

Env de dev = OS, VM, quel version de PHP etc

Belekos, il y a 8 ans

L'OS c'est centOS et la verison de php, php5.6

betaWeb, il y a 8 ans

Je n'avais pas vu que tu avais posté ton JS : il te faut utiliser la classe FormData afin d'envoyer tes fichiers en AJAX ;)

var formData = new FormData($form[0]); var files = $('input[type=file]')[0].files; if (files && files.length) formData.append('image', files[0]); $.ajax({ type: $form.attr('method') || 'POST', url: $form.attr('action'), data: formData, contentType: false, processData: false }) /* ... */

Code non testé, je te laisse peaufiner et creuser ;)

Belekos, il y a 8 ans

Tu penses que je pourrais le rajouter comment dans mon code actuel ? ( je peche un peu en ajax) :p

$('form#invoiceGold').submit(function(event) { event.preventDefault(); var $form = $(this); var $status = $('#upload-status-imp-rapide'); $.post($form.attr('action'), $form.serializeArray()) .done(function(data, text, jqxhr){ $('#rapide-container').find('form').html(' '); $status.css('display', 'block'); $status.removeAttr('class').attr('class', 'alert alert-success'); $status.html(data); $('#close-imp').css('display', 'block').css('margin', '0 auto').css('margin-top', '15px'); }).fail(function(jqxhr){ swal("Oops...", "Merci de contacter le support", "error"); $status.css('display', 'block'); $status.removeAttr('class').attr('class', 'alert alert-danger'); $status.html(err.responseText); }); });
betaWeb, il y a 8 ans

Oui, il faut mixer les deux :

$('form#invoiceGold').submit(function(event) { event.preventDefault(); var $form = $(this); var $status = $('#upload-status-imp-rapide'); var formData = new FormData($form[0]); var files = $('input[type=file]')[0].files; if (files && files.length) formData.append('image', files[0]); $.ajax({ type: $form.attr('method') || 'POST', url: $form.attr('action'), data: formData, contentType: false, processData: false }) .done(function(data, text, jqxhr){ $('#rapide-container').find('form').html(' '); $status.css('display', 'block'); $status.removeAttr('class').attr('class', 'alert alert-success'); $status.html(data); $('#close-imp').css('display', 'block').css('margin', '0 auto').css('margin-top', '15px'); }).fail(function(jqxhr){ swal("Oops...", "Merci de contacter le support", "error"); $status.css('display', 'block'); $status.removeAttr('class').attr('class', 'alert alert-danger'); $status.html(err.responseText); }); });
Belekos, il y a 8 ans

Yes ca marche, super, merci beaucoup !

betaWeb, il y a 8 ans

Pas de quoi, content d'avoir pu t'aider ;)