Bonjour,
c'est mon premier post, donc merci de votre indulgence.
Ayant trouvé qq astuces ici, je retourne le service rendu ...
Le problème qui m'étais posé et que j'ai eu beaucoup de mal a solutionner.
Comment, à partir d'un formulaire web html contenant des divers cases a cocher et champs (nom, légende est ceci , est cela ...), récupérer aussi une image ou un média et traiter toutes ces infos en une seule fois?
voici le code html de la page " formulaire_ajout.html ":
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=iso-8859-1">
<title>Ma page media</title>
</head>
<body bgcolor="#ffffff">
<div align="center">
Publier vos photos ou videos
<form action="/4DACTION/poster_media" method="post" name="poster" enctype="multipart/form-data">
<p><input type="hidden" name="nom" value="<!--4DVAR nom-->"><input type="hidden" name="login" value="<!--4DVAR login-->"></p>
<table width="650" border="1" cellpadding="0">
<tr><td colspan="4">
<center>
<table width="505" border="1" bgcolor="white">
<tr bgcolor="white">
<td><center><b><font size="3" color="blue">- 1 - Renseignez les catégories du média</font></b></center></td></tr>
<tr><td><p>Légende <input type="text" name="legende" size="58"></p></td></tr>
<tr><td><div align="center"><font color="blue"><b>Lieu de ce media</b></font></div></td></tr>
<tr><td valign="top">
<p><font size="-1" face="Arial"><input type="checkbox" name="part_est_auto" value="oui" <!--4DVAR vchxart_est_auto-->> En voiture<br>
<input type="checkbox" name="part_est_avion" value="oui" <!--4DVAR vchxart_est_avion-->> En Avion<br>
<input type="checkbox" name="part_est_lieu_autre" value="oui" <!--4DVAR vchxart_est_lieu_autre-->> Autre lieu<br></font></p></td></tr>
<tr bgcolor="white">
<td valign="top"></td></tr>
<tr bgcolor="white"><td valign="top" bgcolor="white"><div align="center">
<b><font size="3" color="blue">- 2 - Ajouter une photo ou vidéo</font></b>
<p><input type="file" name="lefichier" size="20"></p>
<p>derniere photo ajoutee : <!--4DVAR [galeries_media]nom_doc--><br>
<!--4DVAR [galeries_media]photo--><br>
</p>
<p>Pour ne pas reprendre les valeurs précédentes*, cochez cette case <input type="checkbox" name="stopvaleurs" value="oui"></p></div></td></tr></table>
<p><input type="reset" value="éffacer"> <input type="submit" name="submitButtonName"></p>
<p>Formats acceptés<br>
photos : taille maxi 1Mo (1000ko) - JPG,BMP,GIF<br>
vidéos : taille maxi 20Mo - RM,MOV,QT,WMV,AVI,MPG.</p>
</center></td></tr></table>
</form>
</div>
</body>
</html>
Les variables d'un formulaires étants toujours au format texte (hélas), la seule solution que j'ai trouvée est de mettre le corp entier dans un blob (en effet, la variable "lefichier" est du texte limité a 32 000 caractères, donc innappropriée pour traiter des médias de + de 32Ko .
on crée donc la methode "poster_media"
`--------------------debut méthode poster_media ----------------
` Par Marc Longo - mac osx 10.3.9 - 4D 2004.6
`Date et heure : 10/08/07, 10:23:14
` Description
`upload un fichier image ou vidéo dans 4d à partir d'un formulaire web
`nota : (filename="" n'apparait qu'au postage d'un "POST multipart/form-data ")
C_TEXTE(legende; media_est_auto;media_est_avion;media_est_lieu_autre)
C_TEXTE(nom;login;vchxart_est_auto;vchxart_est_avion;vchxart_est_lieu_autre;stopvaleurs)
`declarer chaque variable du formulaire en format texte est obligatoire
CREER ENREGISTREMENT([galeries_media])
`Il faut déjà traiter les champs classiques :
[galeries_media]legende:=legende
si(media_est_auto="oui")
[galeries_media]est_auto:=vrai
fin de si
si(media_est_avion="oui")
[galeries_media]est_avion:=vrai
fin de si
si(media_est_lieu_autre ="oui")
[galeries_media]est_lieu_autre:=vrai
fin de si
`Une fois le corp du formulaire dans un blob il faut :
` - recuperer le corp entier dans un blob
C_BLOB(lecorp)
LIRE CORPS HTTP(lecorp)
vtailleblob:=Taille BLOB(lecorp)
`trouver le nom du fichier posté
$nomdufichier:=trouve_nom_fichier (lecorp)
`trouve_nom_fichier est une methode dont voici le code
`-------------- debut méthode trouve_nom_fichier --------------
C_BLOB($1)
C_ENTIER LONG($ffset)
C_TEXTE(textedublob)
textedublob:=BLOB vers texte($1;Texte sans longueur ;$ffset;32000)
posfilename:=Position("filename="+Caractere(34);textedublob)
textedublob:=Sous chaine(textedublob;posfilename;posfilename+200)
finpositionfilename:=Position(Caractere(13);textedublob)
$nomdefichier:=Sous chaine(textedublob;11;finpositionfilename-12)
**`si c'est un pc avec \
Si ((Position("\\";$nomdefichier)>0))
Boucle ($bna;1;10)
Si ((Position("\\";$nomdefichier)>0))
posibarre:=Position("\\";$nomdefichier)
$nomdefichier:=Sous chaine($nomdefichier;posibarre+1)
Fin de si
Fin de boucle
Sinon
Fin de si
$0:=$nomdefichier
`-------------- fin méthode trouve_nom_fichier --------------
$nomdufichier:=Remplacer chaine($nomdufichier;" ";"-")
[galeries_media]nom_doc:=$nomdufichier
BLOB VERS DOCUMENT("blob-brut-"+nomdufichier;lecorp)
`on peu lire le blob brut qui a été crée
Au cas ou
: (Position("image";textedublob)#0)
$typemedia:="photo"
Si (vOffset>1000000)
ALERTE("La taille du fichier image ne doit pas dépasser les 1000Ko (1Mo). Sa taille actue"+"lle est de "+Chaine((vOffset)/1000)+" Ko"+Caractere(13)+"Revenez en arrière avec votre navigateur et rechargez le fichier après avoir rédu"+"it sa taille")
Fin de si
: (Position("video";textedublob)#0)*|*(Position("octet-stream";textedublob)#0
$typemedia:="video"
Si (vOffset>20000000)
ALERTE("La taille du fichier image ne doit pas dépasser les 20 000Ko (20Mo). Sa taille ac"+"tue"+"lle est de "+Chaine((vOffset)/1000)+" Ko"+Caractere(13)+"Revenez en arrière avec votre navigateur et rechargez le fichier après avoir rédu"+"it sa taille")
Fin de si
Sinon
$typemedia:="inconu"
Fin de cas
`vous avez identifié le type de media et limité sa taille, vous pouvez modifier a souhait ces alertes
Si ($nomdufichier="")
ALERTE("Désolé, nous n'avons trouvé aucun fichier dans votre transfert"+Caractere(13))
Sinon
`on va maintenant isoler le début du media en éliminant les parties supérieures en examinant le contenu de la variable textedublob
`(qui est une variable process issue de la méthode trouve_nom_fichier)
positiondutypemedia:=Position("Content-Type: ";textedublob)
`on reduit le texte en prenant cette nouvelle base de depart
textedublob:=Sous chaine(textedublob;positiondutypemedia)
`on va jusqu'au retour chariot suivant
positiondebutmedia:=(Position(Caractere(13);textedublob))+3
`+3 car il y a 2 retours chariots + 1 pour le premier caractere du debut du media
textedublob:=Sous chaine(textedublob;positiondebutmedia)
` la variable textedublob commence maintenant par le debut du fichier media
chaineachercherdebutmedia:=Sous chaine(textedublob;1;10)
`on prend les 10 premier caracteres a chercher qui vont servir de référence
chaineachercherfinmedia:="------------0xKhTmLbOuNdArY"
`la fin du media est suivie d'informations complémentaires du formulaires web ------------0xKhTmLbOuNdArY (voir le blob brut ecrit sur votre disque)
`on va donc couper le blob a partir de cette chaine de caracteres
`Pour trouver les chaines appropriés deans le blob, on va créer une methode que j'ai trouvé sur le web
`merci au créateur de la methode ZBLOB_FindString
`---------------debut méthode ZBLOB_FindString -----------------
**` ----------------------------------------------------
**` Nom utilisateur (OS) : christophe Keromen
**` Date et heure : 08/05/04, 08:17:16
**` ----------------------------------------------------
**` Methode : ZBLOB_FindString
**` Description
**`recherche une chaîne dans un BLOB
**`d'après p Marty, méthode blb_Search
**`
**` Parametres
**`$1: POINTEUR:BLOB contenant le texte
**`$2:TEXTE:Texte à chercher
**`$3:ENTIER:OffSet de départ
**`$0:ENTIER: Position du texte cherché
**` ----------------------------------------------------
**`$pos:=ZBLOB_FindString(->blob;"AChercher";APartirDe)
C_ENTIER LONG($0;$3;$Start)
C_POINTEUR($1)
C_TEXTE($2)
C_BOOLEEN($_b_siChaineTrouvee)
$0:=-1**`par défaut non trouvé
$Start:=$3**`Offset de départ
C_BLOB($_x_Cible)**`le BLOB à chercher
$_x_Cible:=$1->
C_BLOB($_x_A_Chercher)
TEXTE VERS BLOB($2;$_x_A_Chercher;Texte sans longueur )
C_ENTIER($_e_LongBlobCible)
$_e_LongBlobCible:=Taille BLOB($_x_Cible)-1
C_ENTIER($_e_LongBlobAchercher)
$_e_LongBlobAchercher:=Taille BLOB($_x_A_Chercher)-1
**`parcourons le BLOB cible à partir de l'offset de départ
C_ENTIER($i)
Boucle ($i;$Start;$_e_LongBlobCible)
Si ($_x_Cible{$i}=$_x_A_Chercher{0})
$_b_siChaineTrouvee:=Vrai
C_ENTIER($ii)
Boucle ($ii;0;$_e_LongBlobAchercher)
Si ($_x_Cible{$i+$ii}#$_x_A_Chercher{$ii})
$_b_siChaineTrouvee:=Faux
$ii:=$_e_LongBlobCible
Fin de si
Fin de boucle
Fin de si
Si ($_b_siChaineTrouvee)
$0:=$i**`la position
$i:=$_e_LongBlobCible
Fin de si
Fin de boucle
`---------------fin méthode ZBLOB_FindString -----------------
`on va pouvoir, grace a cette methode, isoler le début et la fin du média
C_ENTIER($positiondebutmedia;$positionfinmedia)
$positiondebutmedia:=ZBLOB_FindString (->lecorp;chaineachercherdebutmedia;0)
$positiondebutmedia:=$positiondebutmedia+1
$positionfinmedia:=ZBLOB_FindString (->lecorp;chaineachercherfinmedia;$positiondebutmedia)
C_ENTIER($tailleblobOffset)
Si ($positiondebutmedia=0)
`on ne fait rien ou qq chose
Sinon
`on copie la partie du blob qui contient le media dans un nouveau blob
C_BLOB(blobmedia)
FIXER TAILLE BLOB(blobmedia;0)
COPIER BLOB(lecorp;blobmedia;$positiondebutmedia;0;$positionfinmedia-($positiondebutmedia))
Fin de si
`voila le blob est créé vous pouvez le stocker dans la base et/ou sur le disque
BLOB VERS DOCUMENT("media-"+nomdufichier; blobmedia)
au cas ou
: ($typemedia="photo")
BLOB VERS IMAGE(blobmedia;[galeries_media]photo)
: ($typemedia="video")
[galeries_media]video:= blobmedia `le champ video est un champ de type blob
fin de cas
si(stopvaleurs="oui")
vchxart_est_auto:=""
vchxart_est_avion:=""
vchxart_est_lieu_autre:=""
sinon
vchxart_est_auto:=" checked"
vchxart_est_avion:=" checked"
vchxart_est_lieu_autre:=" checked"
fin de si
STOCKER ENREGISTREMENT([galeries_media])
ENVOYER FICHIER HTML("formulaire_ajout.html")
Fin de si
`---------------------fin de la méthode poster_media -----------
il vous reste l'affichage du dernier media a traiter, si c'est une vidéo ou une photo, ainsi que la taille (vous pouvez créer une vignette dans le champ photo et enregistrez le grand format sur le disque), et mettre une image de bande vidéo si c'est une vidéo ( je n'ais pas encore réussi à créer un aperçu image de la vidéo).
Voilà, c'est un peu long ou peut-être inhabituel mais ca marche.
A vous de traiter les informations comme vous l'entendez par la suite,
ce petit programme vous aidera a créer des base d'annonces avec photos, ou de rencontres ou tout autres utilités.
Bon boulot à tous
M.L
Partager