Souhaitez-vous participer à la création d'un jeu vidéo inspiré de Stardew Valley, ou le tester lorsque la version bêta sera disponible ? Remplissez notre sondage ou inscrivez-vous à notre lettre d'information (en bas de page)
1

Formulaire PHP, enctype multipart/form-data

Anon258976
Profil Censuré
le 18-08-2014 à 18:45 #
Bonjour,

J'ai développé un formulaire pour un back-office et voici mon problème, qui peut peut-être paraître abstrait ?

sur un même formulaire, j'ai différents champs dont des champs file pour télécharger des fichiers et parallèlement des infos relatives à ces fichiers et des champs textes pour récupérer de l'information.
J'ai développé les deux scripts (upload et traitement des infos texte) séparément pour les vérifier indépendamment : l'ennui c'est que pour télécharger des fichiers, il faut formater le formulaire en enctype="multipart/form-data", sinon, les info sont indigestes et seul le nom des fichiers, et pas les fichiers eux-mêmes, sont envoyés au serveur (mais ça, vous le savez déjà).

Le problème c'est qu'avec cet enctype, les requêtes php 'classiques' semblent ne plus fonctionner : en somme, la partie collecte et écriture des informations de mon formulaire ne fonctionne qu'avec un enctype par défaut alors que la partie téléchargement ne fonctionne qu'avec l'enctype multipart.

Cependant, on trouve pas mal de formulaires sur le web compilant, ou semblant le faire, à la fois du téléchargement et de la collecte d'informations diverses, alors, c'est quoi l'astuce ?

Je n'arrive pas à trouver d'informations sur le sujet, il y'a foule de tutoriaux pour faire des formulaires de par le web, mais je n'arrive pas à trouver l'info permettant de télécharger en même temps que de récolter des informations "classiques".


merci d'avance,

(Et, si l'envoi "classique" d'infos doit fonctionner en enctype multipart, c'est que ça doit venir de mon code que je vous communiquerait alors).
Re: Formulaire PHP, enctype multipart/form-data
le 19-08-2014 à 15:51 #
Salut,

Montre nous le code, ce sera plus simple!

Ben
Anon258976
Profil Censuré
Re: Formulaire PHP, enctype multipart/form-data
le 19-08-2014 à 18:27 #
Re,

pour le moment, j'ai opté pour une validation en deux étapes (téléchargement en première étape, puis un second formulaire pour entrer les infos (dans mon cas le prix).

Voici l'ancien code (avant validation en deux étapes), s'il est possible de retirer cette validation en "deux étapes" c'est aussi bien :

Code php gérant l'upload des fichiers :


$dosprdt = '../../paiement/tlchrgmnt/';
$fichprdt = basename($_FILES['product']['name']);
$dosap = '../../zonesedit/produits/apercus/';
$fichap = basename($_FILES['apprc']['name']);
$taille_maxi = 10000000;
$taille = filesize($_FILES['product']['tmp_name']);
$taille_maxiap = 1000000;
$tailleap = filesize($_FILES['apprc']['tmp_name']);
$extsprdt = array('.rar', '.zip', '.gzip');
$extprdt = strrchr($_FILES['product']['name'], '.');
$extsap = array('.png', '.gif', '.jpeg', '.jpg');
$extap = strrchr($_FILES['apprc']['name'], '.');
if(!in_array($extprdt, $extsprdt))
{
$erreur = 'Le fichier produit doit être de type rar, zip ou gzip...';
}
if(!in_array($extap, $extsap))
{
$erreurap = 'Le fichier produit doit être de type png, gif ou jpg...';
}
if($taille>$taille_maxi)
{
$erreur = 'Le flux est limité à 10Mo...';
}
if($tailleap>$taille_maxiap)
{
$erreurap = 'Le flux est limité à 1Mo...';
}
if(!isset($erreur))
{
$fichprdt = strtr($fichprdt,
'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ',
'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
$fichprdt = preg_replace('/([^.a-z0-9]+)/i', '-', $fichprdt);
if(move_uploaded_file($_FILES['product']['tmp_name'], $dosprdt . $fichprdt)) //Si la fonction renvoie TRUE, c'est que ça a fonctionné...
{
echo '<div class="creat">Fichier produit téléchargé avec succ&egrave;s.</div>';
}
else
{
echo '<div class="creatno">Echec de l\'upload.</div>';
}
}
else
{
echo $erreur;
}
if(!isset($erreurap))
{
$fichap = strtr($fichap,
'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ',
'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
$fichap = preg_replace('/([^.a-z0-9]+)/i', '-', $fichap);
if(move_uploaded_file($_FILES['apprc']['tmp_name'], $dosap . $fichap)) //Si la fonction renvoie TRUE, c'est que ça a fonctionné...
{
echo '<div class="creat">Apercu produit téléchargé avec succ&egrave;s.</div>';
}
else
{
echo '<div class="creatno">Echec de l\'upload.</div>';
}
}
else
{
echo $erreurap;
}


Code PHP gérant l'écriture de documents (je sais que c'est bizarre mais j'ai la contrainte de développer un back-office sans base de données).
$fichiers = glob("../zonesedit/produits/fichesprdt/*.*");

$compteur = count($fichiers);
$proch_id = count($fichiers)+1;

if( isset($_POST["product"])){
$product = $_POST["product"];
}
if( isset($_POST["apprc"])){
$apprc = $_POST["apprc"];
}
if( isset($_POST["cmtproduit"])){
$cmtproduit = $_POST["cmtproduit"];
}
if( isset($_POST["prxproduit"])){
$prxproduit = $_POST["prxproduit"];
}
if( isset($_POST["product"])){
if ((is_numeric($prxproduit)) AND is_numeric($cmtproduit)){
$nmproduct = pathinfo($product, PATHINFO_FILENAME);
$ecrire_tbl =
'<a href="imgboutique/logo/LOGO5S.jpg" data-lightbox="portfolio"><img src="imgboutique/logo/LOGO5S.jpg" /></a>
<!--Script accessible sur http://www.script-affiliation.fr/paiement-securise.htm -->
<form action="https://www.paypal.com/cgi-bin/webscr" method="post">
<input type="hidden" name="cmd" value="_xclick">
<input type="hidden" name="business" value="thierryhuynh93@gmail.com">
<input type="hidden" name="item_name" value="'.$nmproduct.'">
<input type="hidden" name="item_number" value="'.$proch_id.'">
<input type="hidden" name="amount" value="'.$prxproduit.'.'.$cmtproduit.'">
<input type="hidden" name="no_shipping" value="0">
<input type="hidden" name="no_note" value="1">
<input type="hidden" name="currency_code" value="EUR">
<input type="hidden" name="lc" value="FR">
<input type="hidden" name="rm" value="2">
<input type="hidden" name="return" value="http://www.visiondesigner.fr/remerciements.php">
<input type="hidden" name="cancel_return" value="http://www.visiondesigner.fr/">
<input type="hidden" name="notify_url" value="http://www.visiondesigner.fr/paiement/paypal.php">
<input style="margin-left: 13px;" type="image" src="paiement/acheter.gif" border="0" name="submit" alt="PayPal, votre réflexe sécurité pour payer en ligne"><input style="text-align: right; position: absolute; font-size: 23px; width: 71px;" onfocus="this.blur()" name="price" value="'.$prxproduit.','.$cmtproduit.'€">
<img alt="" border="0" src="https://www.paypal.com/fr_FR/i/scr/pixel.gif" width="1" height="1">
</form>';
$ouvrir_tbl = fopen('../zonesedit/produits/fichesprdt/'.$nmproduct.'.txt', 'w');
fwrite($ouvrir_tbl, $ecrire_tbl);
fclose($ouvrir_tbl);
$ecrire_lst = "<?php \$products[".$proch_id."] = array('".$nmproduct."','".$prxproduit.".".$cmtproduit."','../tlchrgmnt0021554gg78f8/".$product."'); ?>";
$ouvrir_lst = fopen('../zonesedit/produits/listprdt/liste.txt', 'a+');
fwrite($ouvrir_lst, $ecrire_lst);
fclose($ouvrir_lst);
echo '<div class="creat">Création du produit "',$nmproduct,'" effectuée</div>';
}
if (!is_numeric($prxproduit)){
echo '<div class="creatno">Le champ "Prix du produit" doit avoir une valeur numérique,</br>.</div>';
}
if (!is_numeric($cmtproduit)){
echo '<div class="creatno">Le champ "Prix du produit" doit avoir une valeur numérique,</br>n\'oubliez pas le champs des centimes.</div>';
}
}



Le formulaire HTML :


<form class="formstyle" action="scripts/uploadprdt.php" method="post" enctype="multipart/form-data">
<fieldset>
<legend>Télécharger un produit</legend>
<em>Le nom du produit sera attribué automatiquement selon le nom du fichier.</em>
<input type="hidden" value="<?php echo $proch_id; ?>"></input><input type="hidden" name="MAX_FILE_SIZE" value="10000000"></br>
Produit zippé :</br>
<input type="file" name="product"></input></br>
Aperçu du produit :</br>
<input type="file" name="apprc"></input></br>
Prix du produit :</br>
<input type="text" name="prxproduit" style="width:30px;"></input> € <input type="text" name="cmtproduit" style="width:30px;" maxlength="2"> Ctm <em>(ex: 10 € 00 ctm ou 3 € 55 ctm...)</em></br>
<input type="submit" value="Envoyer" />
</fieldset>
</form>


Voilà, le problème avec ce code, c'est que la première partie PHP ne fonctionne qu'en enctype multipart (ce qui est normal pour du téléchargement) mais la seconde ne fonctionne pas avec cet enctype, ça m'oblige à faire deux formulaires, et c'est pas l'idéal... Bon s'il n'y a pas de solution, il me reste ce plan B, donc ce n'est pas pour autant si grave.

(Modifié par Lubrifixor le 19-08-2014 à 18:31)
Re: Formulaire PHP, enctype multipart/form-data
le 19-08-2014 à 19:45 #
Dans ton code d'upload tu ne peux pas simplement lire $_POST['prxproduit'] etc ? Que donne un print_r($_REQUEST) ?
Anon258976
Profil Censuré
Re: Formulaire PHP, enctype multipart/form-data
le 19-08-2014 à 20:19 #
Non, en effet,

J'avais tenté de rendre les deux champs file obligatoires en obligeant le formulaire à télécharger les fichier à la seule condition que les deux champs d'upload soient rempli avec un :

if (isset($_POST["produit"]) AND isset($_POST["apprc"]){
mon code ici.
}else{
echo 'vous devez renseigner les deux champs de téléchargement (produit et appercu)';
}

Résultat, dans tous les cas, pas d'effet, page blanche sans erreur, sans notice, et pas de téléchargement : c'est comme ça que je me suis rendu compte que j'avais un problème
Avec un $_request, les autres résultats apparaissent bien, effectivement, j'ai mon prix et mon max_file_size qui s'affichent, cependant, les champs files se contentent d'envoyer les fichiers sur le serveur sans fournir d'autre informations d'aucune sorte, ce qui m’embête beaucoup puisque j'ai précisément besoin de récupérer le nom de ces fichiers téléchargés dans une autre requête en même temps que ceux-ci soient téléchargés, et j'ai aussi besoin de les rendre obligatoires l'un à l'autre.
Du coups, j'ai l'impression que l'enctype utilisé pour l'upload de fichier est incompatible avec le traitement des informations du type récupération du nom du fichier.
Si c'est le cas, je n'ai plus qu'à trouver une solution de rustine du type, télécharger le fichier ET demander au webmaster de donner le nom de ce même fichier dans un second champ, ce qui fait vraiment bricolage... En plus de cela, ça m'oblige à abandonner l'idée des champs file mutuellement obligatoires.

(Modifié par Lubrifixor le 19-08-2014 à 20:21)
Re: Formulaire PHP, enctype multipart/form-data
le 19-08-2014 à 22:20 #
Que donnent un

print_r($_REQUEST);
print_r($_FILES);


?

(Modifié par ben le 19-08-2014 à 22:20)
Anon258976
Profil Censuré
Re: Formulaire PHP, enctype multipart/form-data
le 19-08-2014 à 22:49 #
En remplissant tous les champs,

print_r($_REQUEST); me renvoie
Array ( [MAX_FILE_SIZE] => 10000000 [prxproduit] => 10 [cmtproduit] => 25 )

(donc pas d'info exploitables en ce qui concerne les nom des fichiers téléchargés)

print_r($_FILES); me renvoie
Array ( [product] => Array ( [name] => cerf.rar [type] => application/octet-stream [tmp_name] => C:\wamp\tmp\php1007.tmp [error] => 0 [size] => 5014361 ) [apprc] => Array ( [name] => barcelets-cuir-guitare01.jpg [type] => image/jpeg [tmp_name] => C:\wamp\tmp\php1008.tmp [error] => 0 [size] => 21947 ) )

Je constate des errors mais je ne vois pas trop à quoi cela correspond ?
C:\wamp\tmp\php1008.tmp [error]
C:\wamp\tmp\php1007.tmp [error]

Je constate aussi qu'il m'imprime à l'écran le nom des fichiers, alors pourquoi je ne peux pas les utiliser dans le formulaire ?
Peut-être n'est-ce pas possible en enctype multipart... En fait, je me demande si finalement je ne cherche pas à avoir le beurre et l'argent du beurre ?
Re: Formulaire PHP, enctype multipart/form-data
le 19-08-2014 à 23:09 #
Code d'erreur 0 c'est que tout va bien.

Je vois les noms de fichiers et tout ce qu'il faut dans $_FILE, le reste dans $_REQUEST (ou $_POST)

Ton « if( isset($_POST["product"])){ » bloque parce que product est dans $_FILE, non ?
Anon258976
Profil Censuré
Re: Formulaire PHP, enctype multipart/form-data
le 19-08-2014 à 23:23 #
Justement, c'est ce que je me demande, et forcément, si je veux le faire bouger [product] et [apprc] dans le $_REQUEST plutôt que dans le $_FILE, il faut que je supprime l'enctype multipart du formulaire, sauf que dans ce cas, mes <input type="file"/> n’enverront plus les fichiers au serveur mais seulement leur nom.

D'après ce que je comprend de mon problème, c'est qu'on ne peut simplement pas récupérer les infos des fichiers ($_FILE) dans des requêtes "classiques", mais je pensait pouvoir trouver une astuce.

Je crois que je cherche à avoir le beurre et l'argent du beurre en fait, et la marchande m'envoie paître.


(Modifié par Lubrifixor le 19-08-2014 à 23:24)
Re: Formulaire PHP, enctype multipart/form-data
le 19-08-2014 à 23:56 #

le 19-08-2014 à 23:23, @Lubrifixor :
si je veux le faire bouger [product] et [apprc] dans le $_REQUEST plutôt que dans le $_FILE

Mais pourquoi ? Tu as tout ce dont tu as besoin dans deux array différents, je dois avoir manqué quelque chose je ne vois pas où est ton problème.
Anon258976
Profil Censuré
Re: Formulaire PHP, enctype multipart/form-data
le 20-08-2014 à 01:33 #
Ah mais oui quel con...
Je viens à peine de percuter que si j'utilise du isset $_POST il faut que j'utilise en réalité du $_FILES, c'est évident... Sauf pour moi , voilà comment concilier le tout en tous cas...

Pfff, j'halucine... le débutant quoi...


Bref, merci pour ton aide en tous cas, je vais tester en appliquant les correctifs.

Nota : ça fonctionne beaucoup mieux avec ça :
if(($_FILES['product']['name'] != "") AND ($_FILES['apprc']['name'] != "")){

merci pour l'aide


(Modifié par Lubrifixor le 20-08-2014 à 02:27)




Ces discussions pourraient vous intéresser également:


Multi input dans un form
Google Adsense PB de formulaire
creer un formulaire d'inscription
Envoi email formulaire
créer formulaire d'inscription sur Cariboost 2.0