Page 1 sur 2

[RESOLU] Communiquer avec un formulaire HTTP

Publié : lun. 09/janv./2023 16:11
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

Re: Communiquer avec un formulaire

Publié : lun. 09/janv./2023 17:14
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

Re: Communiquer avec un formulaire

Publié : lun. 09/janv./2023 17:38
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.

Re: Communiquer avec un formulaire

Publié : lun. 09/janv./2023 17:43
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.

Re: Communiquer avec un formulaire

Publié : lun. 09/janv./2023 18:12
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>

Re: Communiquer avec un formulaire

Publié : lun. 09/janv./2023 18:37
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

Re: Communiquer avec un formulaire

Publié : lun. 09/janv./2023 18:55
par Bmld76
Merci, je vais tester ca.

Re: Communiquer avec un formulaire

Publié : mar. 10/janv./2023 10:15
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"

Re: Communiquer avec un formulaire

Publié : mar. 10/janv./2023 11:20
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
  

Re: Communiquer avec un formulaire

Publié : mar. 10/janv./2023 11:22
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 ?

Re: Communiquer avec un formulaire

Publié : mar. 10/janv./2023 13:54
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.

Re: Communiquer avec un formulaire

Publié : mar. 10/janv./2023 14:12
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)

Re: Communiquer avec un formulaire

Publié : mar. 10/janv./2023 16:32
par Ar-S
conid.i devrait fonctionner en x64

Re: Communiquer avec un formulaire

Publié : mar. 10/janv./2023 16:33
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:

Re: Communiquer avec un formulaire

Publié : mar. 10/janv./2023 17:03
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