[RESOLU] Communiquer avec un formulaire HTTP

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Bmld76
Messages : 116
Inscription : dim. 09/janv./2022 12:47

[RESOLU] Communiquer avec un formulaire HTTP

Message par Bmld76 »

Bonjour et bonne année

Je désire envoyer par le formulaire suivant avec un fichier puis valider mais je bloque sur le codage.

https://www.escrime-info.com/gregxml/Greg/envoyer.php

Après lecture du source le html/javascript on trouve le lien "https://www.escrime-info.com/gregxml/Gr ... p?fichier=" mais le fichier doit certainement être dans un cache ???
Je ne vois pas comment injecter le fichier en pure basic.

Pouvez-vous me fournir une piste.

Bien cordialement
Dernière modification par Bmld76 le jeu. 19/janv./2023 13:18, modifié 2 fois.
_____________________________________________________________
IMAC 21.5 2012 Core I5 - 2.70 Ghz. 16 GB NVIDIA GeForce GT 640M 512 Mo. MacOs OCPL Sonoma 14.3
MacBook Air M1 - 8Go - Sonoma 14.5

PureBasic 6.11 MacOS
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Communiquer avec un formulaire

Message par falsam »

Si j'ai bien compris tu souhaites envoyer un fichier à un formulaire en ligne.

Regarde la fonction httprequest()
:arrow: https://www.purebasic.com/french/docume ... quest.html
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Bmld76
Messages : 116
Inscription : dim. 09/janv./2022 12:47

Re: Communiquer avec un formulaire

Message par Bmld76 »

Bonsoir,

Oui, c'est ca et je suis en train de voir cette fonction, mais il y a du javascript et je ne sais pas si il est possible d'utiliser Httprequest dans ce cas.
_____________________________________________________________
IMAC 21.5 2012 Core I5 - 2.70 Ghz. 16 GB NVIDIA GeForce GT 640M 512 Mo. MacOs OCPL Sonoma 14.3
MacBook Air M1 - 8Go - Sonoma 14.5

PureBasic 6.11 MacOS
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Communiquer avec un formulaire

Message par falsam »

Le fichier que tu utilises avec HTTPRequest est ton script php https://www.escrime-info.com/gregxml/Greg/envoyer.php

Je ne vois pas trop ou est le souci et quand intervient ton script Javascript.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Bmld76
Messages : 116
Inscription : dim. 09/janv./2022 12:47

Re: Communiquer avec un formulaire

Message par Bmld76 »

La selection de fichier est du javascript et nom un formulaire html .

<script language="javaScript">function envoi(){document.PosterFichier.action="./envoyer.php?fichier="+document.PosterFichier.ficXML.value;document.PosterFichier.submit();}</script>
_____________________________________________________________
IMAC 21.5 2012 Core I5 - 2.70 Ghz. 16 GB NVIDIA GeForce GT 640M 512 Mo. MacOs OCPL Sonoma 14.3
MacBook Air M1 - 8Go - Sonoma 14.5

PureBasic 6.11 MacOS
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Communiquer avec un formulaire

Message par falsam »

Tu peux essayer ce code ?

Code : Tout sélectionner

EnableExplicit 

Define url.s = "https://www.escrime-info.com/gregxml/Greg/envoyer.php?fichier="
Define fileName.s
Define *buffer, size

InitNetwork()

;// Le fichier étant bidon tu verras une erreur dans le débug
fileName = "test.xml" 

*Buffer = ReceiveHTTPMemory(url + fileName)
If *Buffer
  size = MemorySize(*Buffer)
  Debug "Résultat: " + PeekS(*Buffer, Size, #PB_UTF8|#PB_ByteLength)
  FreeMemory(*Buffer)
Else
  Debug "Ooops url non disponible"
EndIf
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Bmld76
Messages : 116
Inscription : dim. 09/janv./2022 12:47

Re: Communiquer avec un formulaire

Message par Bmld76 »

Merci, je vais tester ca.
_____________________________________________________________
IMAC 21.5 2012 Core I5 - 2.70 Ghz. 16 GB NVIDIA GeForce GT 640M 512 Mo. MacOs OCPL Sonoma 14.3
MacBook Air M1 - 8Go - Sonoma 14.5

PureBasic 6.11 MacOS
Bmld76
Messages : 116
Inscription : dim. 09/janv./2022 12:47

Re: Communiquer avec un formulaire

Message par Bmld76 »

Bonjour et merci du coup de main,

J'ai extrait la page (http://bmaillard.free.fr/greg/envoyer.php?fichier=) pour observer les paramètres transmis. Le fichier est transmit par la méthode "FILES"

get
Array
(
[fichier] => C:\\fakepath\\test.xml
)

files
Array
(
[ficXML] => Array
(
[name] => test.xml
[type] => text/xml
[tmp_name] => /mnt/108/sdb/e/e/bmaillard/phplw95c9
[error] => 0
[size] => 4319
)

)

J'ai testé ton code mais celui-ci passe le nom de fichier par la méthode "GET" et non par la méthode "FILES". Il faut que je trouve comment créer la structure qui implémente "FILES"
_____________________________________________________________
IMAC 21.5 2012 Core I5 - 2.70 Ghz. 16 GB NVIDIA GeForce GT 640M 512 Mo. MacOs OCPL Sonoma 14.3
MacBook Air M1 - 8Go - Sonoma 14.5

PureBasic 6.11 MacOS
Bmld76
Messages : 116
Inscription : dim. 09/janv./2022 12:47

Re: Communiquer avec un formulaire

Message par Bmld76 »

Bonjour,

J'ai trouvé un code qui correspondre à mon besoin. Mais j'ai une erreur 'accès memoire invalide' à la ligne SendNetworkData(conid,*Buffer,Len(POST$)). J'ai vérifié les pointeurs , ça à l'air correct. Pouvez vous m'aider sur ce point. Le code doit être exécutable tel quel même sans la présence du fichier test.xml.

Code : Tout sélectionner

;################################################################
;# 22/2/2006 - Upload file to web trough POST command | Pantcho #
;# Mar-19-2015 - update so it works on other systems?           #
;# PB 5.31 x64                                                  # 
;################################################################
; CompilerIf #PB_Compiler_Unicode 
;   Debug "NO UNICODE FOR THIS ONE"
;   End
; CompilerEndIf
; 

EOL$ = Chr(13)+Chr(10) 
QT$=Chr(34)
URL$ = "bmaillard.free.fr" ; the main domain "posttestserver.com" is a good test domain
PATH$ = "/greg/receive.php"         ; /post.php works fine at "posttestserver.com" or what ever script that accepts the enctype="multipart/form-data"    
Debug "repertoire actuel "+ GetCurrentDirectory()
FullFileName$ = "test.xml" ; Full path+filename, choose your own path
ActionName$ = "filesend"            ; this is important!! this action must be the same as  <form ... name="filesend">
Border$ = "232323RANDOMLETTERSNUMBERS23232" ; Border to the file data (Check RFC for more info)

; added an extra POST variable because sometimes you need this when you are posting like a security password etc.
; so the post on this will be "varnonumber" and the data will be "dataforvarnonumber 1" I called it varnonumber because "var2" would not work!!
FileHeader$ = "Content-Disposition: form-Data; name="+QT$+"varnonumber"+ QT$+EOL$+EOL$+"dataforvarnonumber 1"+EOL$+"--"+Border$+EOL$; Silly var names no numbers

FileHeader$ + "Content-Disposition: form-Data; name="+QT$+ActionName$ + QT$ +"; filename="+QT$+ FullFileName$+ QT$ +EOL$ 
FileHeader$ + "Content-Type: text/plain" ; <= Here change the content type regarding your file! (text,image etc...) we go on text
; ^^^ note: Havn't been tested with binary files.

If InitNetwork()
  conid.l = OpenNetworkConnection(URL$,80)
  If conid
      Debug "Connected"
      *Buffer = AllocateMemory(65000) ; some memory for our file buffer
      POST$ = "POST "+ PATH$ +" HTTP/1.1"+#CRLF$+"Host: "+URL$+#CRLF$+"Accept: */*"+#CRLF$+"User-Agent: PureBasic/4.04 CFNetwork/711.1.16 Darwin/14.0.0"  ; the Post command we are going to send to the server
   
      OpenFile(1,FullFileName$)
      Repeat
        Text$ = ReadString(1)
        FILE$ + EOL$+Text$
      Until Eof(1)
      ; This is the border header for uploading
      FILE$ = "--"+Border$ + EOL$ + FileHeader$ +EOL$ + FILE$ +EOL$+ "--" + Border$ + "--" 
      ; Back to post, while sending header with the correct content length (border+file+border)
      POST$ + EOL$ + "Content-Type: multipart/form-Data, boundary="+Border$ + EOL$ + "Content-Length: " + Str(Len(FILE$)) 
      POST$ + EOL$ + EOL$ + FILE$ 
      CloseFile(1)
      ;Debug POST$
      ;Debug "+++++++++++++++++++"
      
      
      PokeS(*Buffer,"",0)
      PokeS(*Buffer,POST$,Len(POST$))
      
      Debug "§§§§§§§§§§§§§§§§§§§"
      Debug conid
      Debug "*******************"
      Debug *Buffer
      Debug PeekS(*Buffer) 
      Debug "*******************"
      
      SendNetworkData(conid,*Buffer,Len(POST$))
      ;SendNetworkData(conid,*Buffer,100)

      Repeat
        Server$ = PeekS(*Buffer)
        res.l = ReceiveNetworkData(conid, *Buffer, 1000)
      Until Server$ = PeekS(*Buffer)
      Debug Server$
  Else 
    Debug "NO CONNECTION"
  EndIf
Else
  Debug "Pas de connexion"
EndIf
;filereceive.php
;// PHP sample file you could upload to a server. Name this filereceive.php and change PATH$="filereceive.php" on this PB program.
;// it is expecting ActionName$="filesend" from this PB Sample
;// all it does is take the temp file you sent and echo it back to you. 
; <?PHP
; If (isset($_FILES['filesend']['error'])){echo "SEND ERROR";}                //checks for errors
;       If ($_FILES['filesend']['error'] == UPLOAD_ERR_OK               //checks For errors
;      && is_uploaded_file($_FILES['filesend']['tmp_name'])) { //checks that file is uploaded
;   echo file_get_contents($_FILES['filesend']['tmp_name']); //SENDS FILE BACK TO YOU
;   }
;   //End TEST
;  ?>
;// end of php sample
  
_____________________________________________________________
IMAC 21.5 2012 Core I5 - 2.70 Ghz. 16 GB NVIDIA GeForce GT 640M 512 Mo. MacOs OCPL Sonoma 14.3
MacBook Air M1 - 8Go - Sonoma 14.5

PureBasic 6.11 MacOS
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Communiquer avec un formulaire

Message par Ar-S »

Quelques idées en vrac :
- Franchement pour l'envoi de fichier, surtout d'un PC local, pourquoi ne pas utiliser le FTP ?
- Est-ce ton site escrime-info.com ?
- Du XML n'étant que du texte, ne peux tu pas créer un API en php pour traiter justement des données textes d'un envoie POST via PB ?
- Est-ce que PB est vraiment nécessaire pour cette opération ?
- Ne serait-il pas plus simple d'utiliser un webgadget dans ton programme PB ?
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Bmld76
Messages : 116
Inscription : dim. 09/janv./2022 12:47

Re: Communiquer avec un formulaire

Message par Bmld76 »

Bonjour et merci pour ces pistes

- Franchement pour l'envoi de fichier, surtout d'un PC local, pourquoi ne pas utiliser le FTP ? j'aurais préféré mais le gestionnaire du site ne veux plus administrer FTP. D'autre logiciel fonctionne de cette manière
- Est-ce ton site escrime-info.com ? Oui
- Du XML n'étant que du texte, ne peux tu pas créer un API en php pour traiter justement des données textes d'un envoie POST via PB ? à creuser
- Est-ce que PB est vraiment nécessaire pour cette opération ? J'ai développé un logiciel de gestion de compétition d'escrime en PB donc la mise à jour des résultats en ligne est en PB
- Ne serait-il pas plus simple d'utiliser un webgadget dans ton programme PB ? oblige des manipulations alors que la mise à jour doit être transparente pour l'utilisateur

La méthode $_FILES consiste à transmettre un fichier formaté ( comme les envoies de mail). Cette partie la est réglée mais pour la mettre en oeuvre je dois régler problème d'accès mémoire de la solution présentée dans le code trouvé sur le forum anglais.
_____________________________________________________________
IMAC 21.5 2012 Core I5 - 2.70 Ghz. 16 GB NVIDIA GeForce GT 640M 512 Mo. MacOs OCPL Sonoma 14.3
MacBook Air M1 - 8Go - Sonoma 14.5

PureBasic 6.11 MacOS
Bmld76
Messages : 116
Inscription : dim. 09/janv./2022 12:47

Re: Communiquer avec un formulaire

Message par Bmld76 »

J'ai trouve le pb access memoire invalide

La déclaration de la variable conid.l = OpenNetworkConnection(URL$,80)

doit être conid = OpenNetworkConnection(URL$,80)
_____________________________________________________________
IMAC 21.5 2012 Core I5 - 2.70 Ghz. 16 GB NVIDIA GeForce GT 640M 512 Mo. MacOs OCPL Sonoma 14.3
MacBook Air M1 - 8Go - Sonoma 14.5

PureBasic 6.11 MacOS
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Communiquer avec un formulaire

Message par Ar-S »

conid.i devrait fonctionner en x64
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Marc56
Messages : 2197
Inscription : sam. 08/févr./2014 15:19

Re: Communiquer avec un formulaire

Message par Marc56 »

Si je résume:
1. Tu possède le site, donc tu peux aller côté serveur.
2. Tu veux envoyer un fichier xml depuis une application PB
?

Si oui, alors voilà un exemple minimum.
:!: Ce système ne va pas stocker des fichiers XML directement.
C'est au script PHP de parser la variable $_REQUEST["XML"] et de l'envoyer vers un/des fichier(s) ou vers une base de données.
L’intérêt est que tu peux filtrer ce qui est envoyé pour ne pas subir du flood.

Code PHP à mettre sur le serveur:
(envoyer.php à renommer si on ne veut conserver l'autre)
(se contente ici d'afficher ce qu'il a reçu)

Code : Tout sélectionner

<?PHP
	print("<HTML>");
	print "XML Data = " . $_REQUEST["XML"];
	print("</HTML>");
?>
Code PB pour envoyer le fichier
(simple requête HTTP méthode Post (envoi des données dans le corps du message)

Code : Tout sélectionner

XML$ = "XML=<Test>Hello World</Test>"

HttpRequest = HTTPRequest(#PB_HTTP_Post, "127.0.0.1/envoyer.php", XML$)

If HttpRequest
    Debug "Status : " + HTTPInfo(HTTPRequest, #PB_HTTP_StatusCode)
    Reponse$ = HTTPInfo(HTTPRequest, #PB_HTTP_Response)
    FinishHTTP(HTTPRequest)
    
    ; Affichage de test
    File$ = GetTemporaryDirectory() + "test.html"
    DeleteFile(File$)
    OpenFile(0, File$)
    WriteString(0, Reponse$)
    CloseFile(0)
    RunProgram(File$)
    
Else
    Debug "La requête a échoué"
EndIf
C'est une base. À toi d'améliorer. Cela fait longtemps que je n'ai pas fait de PHP, donc c'est un bricolage rapide.
:idea: Si tu as accès complet au serveur, tu peux aussi créer un système à base de CGI avec PB
:wink:
Bmld76
Messages : 116
Inscription : dim. 09/janv./2022 12:47

Re: Communiquer avec un formulaire

Message par Bmld76 »

Merci Marc56

j'ai accès a un site test similaire pour le moment mais pas au site défini (ce serait trop facile) donc cela m'oblige à m'adapter
donc je ne peut pas utiliser la méthode $_REQUEST mais uniquement la méthode $_FILES
_____________________________________________________________
IMAC 21.5 2012 Core I5 - 2.70 Ghz. 16 GB NVIDIA GeForce GT 640M 512 Mo. MacOs OCPL Sonoma 14.3
MacBook Air M1 - 8Go - Sonoma 14.5

PureBasic 6.11 MacOS
Répondre