Draedalus |
Le 05/07/2007 à 17:05 |
|
|
Bonjour, je me permets de poster ici car je suis malheureusement frustré dans mes recherches...
Apres avoir créer le site pour la société où je usis en stage, j'ai crée un formulaire de demande de devis [url=www.enrdiffusion.com/devis.php]devis en ligne[/url] Après quelques semaines (oui j'sais, j'ai du mal pour le php donc j'apprends ^^') j'ai fini par parvenir à mes fins. A savoir traiter le formulaire en php et envoyer les informations saisies par email.
Maintenant j'aimerais ajouter une fonction d'upload à la demande de devis qui était souvent utilisée sur le précédent formulaire. Mais bon, comme tout bon débutant, je rencontre encore des difficultes que je n'arrive pas à résoudre malgré des conseils et aides qui n'ont pu corriger les soucis.
Je me permets de poster le code ci-dessous pour ce qui est de l'envoi et du traitement du fichier.
page devis2.php (envoie de l'image)
<input type="file" name="upload" size="20" value="<?=($_SESSION['upload']? $_SESSION['upload']: ""); ?>">
<input type="hidden" name="MAX_FILE_SIZE" value="1000000" />
page devis3.php (traitement des donnes saisies dans devis2.php)
<?php
ini_set('upload_tmp_dir', $_SERVER['DOCUMENT_ROOT'] . DIRECTORY_SEPARATOR . 'tmp' . DIRECTORY_SEPARATOR);
[...]
//champs upload
$_SESSION["upload"] = $_FILES["upload"];
//si un fichier est envoye
if(!empty($_FILES['upload']))
{
//dossier où sera déplacé le fichier
$content_dir = 'img/devis_upload/';
$tmp_file = $_FILES['upload']['tmp_name'];
$name_file = $_FILES['upload']['name'];
//si le fichier est upload
if(is_uploaded_file($tmp_file))
{
// on vérifie son extension
$type_file = $_FILES['upload']['type'];
if(!strstr($type_file, 'jpg') && !strstr($type_file, 'jpeg') && !strstr($type_file, 'png') && !strstr($type_file, 'gif'))
{
echo "Le type de fichier soumis n'est pas accepte";
exit;
}
//on verifie que le nom du fichier ne pose pas de probleme au niveau de la securite
if(preg_match('#[x00-x1Fx7F-x9F/\\]#', $name_file))
{
echo "Veuillez changer le nom de votre image pour des raisons de securite";
exit;
//ou exit("Veuillez changer le nom de votre image pour des raisons de securite");
}
if(!move_uploaded_file($tmp_file, $content_dir . $name_file))
{
echo "Impossible de copier le fichier dans $content_dir";
exit;
}
else
{
echo "Le fichier a bien ete envoye dans $content_dir";
exit;
}
}
}
?>
[...]
<?php if(move_uploaded_file($tmp_file, $content_dir . $name_file))
{
echo 'Vous avez joint une image dans votre devis';
}
else
{
echo 'Vous n'avez pas joint d'image dans votre devis';
}
?>
Le but étant d'uploader une image qui serait par la suite envoyée en piece jointe (par mail donc) en complement des infos saisies prealablement.
Voilà le code d'erreur qui apparait lors de la tentative d'upload
Warning: move_uploaded_file(img/devis_upload/appui2.JPG) [function.move-uploaded-file]: failed to open stream: Permission denied in /home/www/4017a44ee11a13cf0358a9ad529628f5/web/devis3.php on line 149
Warning: move_uploaded_file() [function.move-uploaded-file]: Unable to move '/tmp/phprKFSp6' to 'img/devis_upload/appui2.JPG' in /home/www/4017a44ee11a13cf0358a9ad529628f5/web/devis3.php on line 149 Impossible de copier le fichier dans img/devis_upload/ -- Rien ne sert de courir, il faut partir à point.
Les chiffres de l'actualité - http://draedalus.wordpress.com |
Jeanluc |
Le 06/07/2007 à 18:55 |
|
|
Bonsoir, comme le dit le message: 'move_uploaded_file(img/devis_upload/appui2.JPG)...Permission denied', autrement dit, tu n'as pas les droits d'écrire dans le répertoire. Essaye de le changer avec ton programme FTP et de mettre les droits (chmod) en écriture (Write).
Jean-Luc |
Draedalus |
Le 09/07/2007 à 15:38 |
|
|
Merci pour ta réponse, l'upload marche correctement maintenant cependant je rencontre des difficultés et je ne sais pas si cela est du au principe des sessions (vu que je n'utilise pas de BDD).
[url=www.enrdiffusion.com/devis.php]devis en ligne[/url] donc le soucis concerne l'image en fait parce que je me demandais comment maintenant l'ajouter en pièce jointe ? je ne connais pas forcément le nom de l'image et donc j'aurais aimé la foutre en pièce jointe mais je ne vois pas du tout comment procéder (sachant que le nom de l'image m'est inconnu). J'ai pensé à la renommer parce que l'on m'a conseillé la méthode srand mais bon, j'm'y perds vite malheureusement. une idée pi-être ? et une fois renommée ? comment savoir que l'image que l'on va mettre en pièce jointe est bien celle fournie par celui qui fait la demande ?
Cordialement draedalus
merci par avance -- Rien ne sert de courir, il faut partir à point.
Les chiffres de l'actualité - http://draedalus.wordpress.com |
Jeanluc |
Le 09/07/2007 à 18:02 |
|
|
Bonjour, l'envoi de pièces jointes n'est pas directement géré par php, regarde du coté de libmail.php. Puisque tu a l'air de ne pas trop aimer les bases de donnée, tu peux éventuellement créer un fichier dont le nom est le nom/prenom de la personne et dont le contenu est le nom de l'image. Mais je te conseille vivement de voir avec une base de donnée, tu peux y stoquer toutes les informations clientèles et c'est assez simple à manipuler. J'espère avoir tout compris et répondu à tes questions
Jeanluc |
Draedalus |
Le 10/07/2007 à 10:30 |
|
|
En fait il ne me reste plus que 4 jours de stage donc je n'ai vraiment pu trop le temps de tout reprendre pour une faire un devis avec BDD mais je compte m'entrainer par la suite à le faire. Hier justement j'ai réfléchi et j'ai pensé au fait de renommer l'image en lui attribuant le nom de la personne qui fait son devis. Ce qui donnerait donc par exemple si M. Untel fait sa demande photoUntel (sachant qu'il ne peut uploader qu'une seule image). J'ai pu lire que l'on pouvait renommer les images uploadées sur le serveur avec la fonction rename mais n'étant pas supra expert en php je viens réclamer clémence et aide  . Merci! merci pour ton info je vais aller y jeter un coup d'oeil -- Rien ne sert de courir, il faut partir à point.
Les chiffres de l'actualité - http://draedalus.wordpress.com |
Jeanluc |
Le 10/07/2007 à 12:12 |
|
|
rename( 'vieux_nom.jpg', 'photountel.jpg' ); Mais n'oublie pas qu'il y a beaucoup de Mr Dupont sur la planète, yu peux aussi le renomer en y incluant la date par exemple: rename( 'vieux_nom.jpg', date("mdy").'-photountel.jpg' ); et comme ça, elle s'appelera 100707-photountel.jpg ... et pour effacer une image qui ne sert plus à rien: unlink('photountel.jpg');
A toi de voir
Jeanluc |
Draedalus |
Le 10/07/2007 à 14:41 |
|
|
Alors j'arrive correctement à renommer mon image maintenant :)
J'ai utilisé ce code qui permet donc de lui attribuer le nom de la personne qui envoie le devis et la date comme vous me l'avez conseillé :
<?php $name_file = $_SESSION['nom'] . date("dmy") . $_FILES['upload']['name'];?>
et maintenant j'essaye d'envoyer le devis avec la piece jointe mais plus rien ne marche, apres avoir appuyé sur le bouton d'envoi la redirection est correcte cependant le mail ne me parvient pas :s
je n'arrive pas à trouver l'origine du pb, est ce que cela peut venir d'un conflit ? parce j'ai trouvé le code et je l'ai modifié avec mes valeurs mais bon rien y fait
Ci-dessous le code que j'ai utilisé pour envoyer les données saisies et la pièce jointe
<?php // Destinataire
$to = "marketing@blablablou_antispam_bloublou.com";
//Objet
$subject = "Demande de devis provenant de M./Mlle/Mme : " .$nom."\r\n";
// clé aléatoire de limite
$boundary = md5(uniqid(microtime(), TRUE));
// Headers
$headers .= 'Mime-Version: 1.0'."\r\n";
$headers .= 'Content-Type: multipart/mixed;boundary='.$boundary."\r\n";
$headers .= "\r\n";
//Accuse de reception
X-Confirm-Reading-To: $_SESSION["adresse"]."\r\n";;
// Message
$msg .= '--'.$boundary."\r\n";
$msg .= 'Content-type:text/plain;charset=utf-8'."\r\n";
$msg .= 'Content-transfer-encoding:8bit'."\r\n";
$msg .=
'Coordonnees\n
nom : $nom
prenom : $prenom
adresse : $adresse
ville : $ville
departement : $departement
tel : $tel
email : $email \n
L\'installation\n
type d\'installation : $choix_photovoltaique
type d\'installation : $autre_photovoltaique Wc
type de pose : $pose_photovoltaique \n
Le batiment\n
type de batiment : $type_batiment
type de batiment : $autre_batiment \n
La toiture \n
type de toiture : $type_toiture
orientation toiture : $orientation_toiture
inclinaison toiture : $inclinaison_toiture
hauteur toiture : $hauteur_toiture
surface de la toiture : $toiture_A m de long pour $toiture_B m de large \n
Le projet\n
date de projet : $delai_projet
commentaires : $commentaires'."\r\n";
// Pièce jointe
$file_name = $name_file;
if (file_exists($file_name))
{
$file_type = filetype($file_name);
$file_size = filesize($file_name);
$handle = fopen($file_name, 'r') or die('Le fichier '.$file_name.'ne peut pas etre ouvert');
$content = fread($handle, $file_size);
$content = chunk_split(base64_encode($content));
$f = fclose($handle);
$msg .= '--'.$boundary."\r\n";
$msg .= 'Content-type:'.$file_type.';name='.$file_name."\r\n";
$msg .= 'Content-transfer-encoding:base64'."\r\n";
$msg .= $content."\r\n";
}
// Fin
$msg .= '--'.$boundary."\r\n";
mail($to,$subject,$msg,$headers);
header('Location: merci.html');?>
Merci en tout cas pour ta contribution -- Rien ne sert de courir, il faut partir à point.
Les chiffres de l'actualité - http://draedalus.wordpress.com |
Jeanluc |
Le 10/07/2007 à 20:47 |
|
|
Bonsoir, tiens, essaye ce bout de code, ça devrait aller:
<?php
function get_extension($filename)
{ $parts = explode('.',$filename);
$last = count($parts) - 1;
$ext = $parts[$last];
return $ext;
}
$file_name = $name_file;
$extension=get_extension($file_name);
$file_type="image/png";
if($extension=="gif"){$file_type="image/gif";}
else if($extension=="bmp"){$file_type="image/bmp";}
// Destinataire
$to = "marketing@blablablou_antispam_bloublou.com";
//Objet
$subject = "Demande de devis provenant de M./Mlle/Mme : " .$nom."rn";
// clé aléatoire de limite
$boundary = md5(uniqid(microtime(), TRUE));
// Headers
$headers = "From: $email <$email>"."rn";
$headers .= "MIME-Version: 1.0rn";
$headers .= 'Content-Type: multipart/mixed;boundary='.$boundary."rn";
$headers .= "rn";
//Accuse de reception
$headers .= "X-Confirm-Reading-To: ".$_SESSION["adresse"]."rn";
// Message
$msg = "--$boundaryrn";
$msg .= "Content-Type: text/plain; charset="iso-8859-1"rn";
$msg .= "Content-Transfer-Encoding:8bitrn";
$msg .= "Coordonneesn
nom : $nom
prenom : $prenom
adresse : $adresse
ville : $ville
departement : $departement
tel : $tel
email : $email n
L'installationn
type d'installation : $choix_photovoltaique
type d'installation : $autre_photovoltaique Wc
type de pose : $pose_photovoltaique n
Le batimentn
type de batiment : $type_batiment
type de batiment : $autre_batiment n
La toiture n
type de toiture : $type_toiture
orientation toiture : $orientation_toiture
inclinaison toiture : $inclinaison_toiture
hauteur toiture : $hauteur_toiture
surface de la toiture : $toiture_A m de long pour $toiture_B m de large n
Le projetn
date de projet : $delai_projet
commentaires : $commentaires"."rn";
// Pièce jointe
if (file_exists($file_name))
{ $file_size = filesize($file_name);
$handle = fopen($file_name, 'r') or die('Le fichier '.$file_name.'ne peut pas etre ouvert');
$content = fread($handle, $file_size);
$f = fclose($handle);
$content = chunk_split(base64_encode($content));
$msg .= "--$boundaryrn";
$msg .= "Content-type:$file_type;name="$file_name"rn";
$msg .= "Content-transfer-encoding: base64rn";
$msg .= "Content-Disposition: inline; filename="$file_name"rn";
$msg .= "rn";
$msg .= $content."rn";
$msg .= "--$boundary--rn";
}
// Fin
mail($to,$subject,$msg,$headers);
header('Location: merci.html');
?>
Jeanluc |
Draedalus |
Le 11/07/2007 à 09:15 |
|
|
Bonjour,
alors j'ai testé ton code et j'obtiens l'erreur suivante
Parse error: syntax error, unexpected T_STRING in /home/www/4017a44ee11a13cf0358a9ad529628f5/web/devis3.php on line 498
sachant que la ligne 498 est
$msg .= "Content-Type: text/plain; charset="iso-8859-1"rn";
Et comme je ne comprends pas tout le code corrigé je n'arrive pas à le modifier :s
De plus dans le code je remarque des "n" et j'aurais voulu savoir si c'était volontaire ou si je devais les remplacer par "\n". Pour les "rn" je remarque les deux cas différents ci dessous $headers = "From: $email <$email>"."rn"; $headers .= "MIME-Version: 1.0rn"; Est-ce normal ou dois-je séparer les rn comme pour le cas du 1er header ?
Merci pour ton aide en tout cas -- Rien ne sert de courir, il faut partir à point.
Les chiffres de l'actualité - http://draedalus.wordpress.com |
Jeanluc |
Le 11/07/2007 à 12:19 |
|
|
corrige $msg .= "Content-Type: text/plain; charset="iso-8859-1"rn"; en $msg .= "Content-Type: text/plain; charset="iso-8859-1" rn";
Tes n dans tes mails, je supose que c'est pour faire des retours à la ligne, a mon avis tu ne dois rien mettre ... étant donné que la mise en page est bonne sans ça ;- Si tu écris "rn", il le prend pour 2 caractères normaux, si tu l'ecris "rn" il le prend comme étant un retour à la ligne suivit d'une descente à la ligne suivante. Donc tu dois avoir: $headers = "From: $email <$email>rn"; $headers .= "MIME-Version: 1.0rn";
...je viens de réaliser que le forum suprimait les anti-slash! donc tu en mets là où il faut ;- (machine raciste)
Jeanluc |