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
Réponse acceptée

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);
    });

});

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
Auteur

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

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

Belekos
Auteur

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');

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
Auteur

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';
}

Quelle version de Slim utilises-tu ?

Belekos
Auteur

Il me semble que c'est la version 3

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
Auteur

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 ;)

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
Auteur

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

Belekos
Auteur

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

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

Belekos
Auteur

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)

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

Belekos
Auteur

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

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
Auteur

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);
    });

});
Belekos
Auteur

Yes ca marche, super, merci beaucoup !

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