Envoi de fichier par requête Http Post

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Re: Envoi de fichier par requête Http Post

Message par Thyphoon »

Kwai chang caine a écrit :Bonjour à tous les deux

Je m'excuse de m'inserer au milieu de votre super experience qui m'interesse au plus haut point 8)
Seulement comme dab, j'ai les billes dans les mains et je sais pas jouer, j'ai pas compris comment tester ces codes :oops:

J'ai posé à la racine du serveur le "test.php" de typhoon
J'ai lancé les divers codes avec texte et fichier, mais je ne comprend pas ce qui devrait se passer ???

Pour ce qui est des fichier ou apparaissent t'il ???
Et pour les textes, cela me retourne bien un phrase, mais que dois-je en faire ?? :oops:

Merci 8)
le fichier test.php pour l'instant n'affiche que les infos qu'il reçoit!(le fichier lui est sur le serveur dans répertoire tmp sous un nom un peu zarbi
donc lorsque ça marche voilà ce que tu dois avoir (+le code html qui apparait quoi qu'il se passe)

Code : Tout sélectionner

POST REQUEST Ok/___FILE /array(2) {    <=Il y a 2 fichier
  ["fileA"]=>
  array(5) {
    ["name"]=>
    string(11) "scenari.ini"  <= non du fichier
    ["type"]=>
    string(24) "application/octet-stream" 
    ["tmp_name"]=>
    string(14) "/tmp/phpAIXzp8" <= le nom et sa location temporairement sur le serveur
    ["error"]=>
    int(0)
    ["size"]=>
    int(175)
  }
  ["fileB"]=>
  array(5) {
    ["name"]=>
    string(12) "scenar2i.ini"
    ["type"]=>
    string(24) "application/octet-stream"
    ["tmp_name"]=>
    string(14) "/tmp/phpomtvP7"
    ["error"]=>
    int(0)
    ["size"]=>
    int(175)
  }
}
Edit:dernière version du code un peu plus bas...
Dernière modification par Thyphoon le lun. 27/juin/2011 20:40, modifié 1 fois.
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Re: Envoi de fichier par requête Http Post

Message par Thyphoon »

EUREKA ! j'ai réussi voici le code brut qui fonctionne pour envoyer des variables ou des fichiers sous une forme de requête POST
Pfff ça été dur, car les headers sont super sensible au retour en ligne et au ligne vide. Faut avouer que celui qui a pondu cette norme n'a pas su faire les choses simples....
demain nettoyage et vérification que les données des fichiers envoyé n’ont pas été abimé au passage ... voir pour que ça marche compilé en unicode
et apres faudra tester sur différent serveur si tout fonctionne comme il faut...mais je trouche au but !

Code : Tout sélectionner

Structure post_variable
  name.s    ;Variable Name
  value.s   ;Variable Value
EndStructure

Structure post_file
  actionName.s  ; this is important!! this action must be the same as  <form ... name="file">
  path.s        ; path+filename about file to send
  mime.s        ; mime-type
EndStructure

Structure proxy_structure
  server.s      ;
  port.l        ;
  login.s       ;
  password.s    ;
EndStructure

Structure post_structure
  url.s         ;url to send POST
  proxy.proxy_structure
  List variable.post_variable() ;variables
  List file.post_file() ;files
EndStructure

;Init Url to send Post Data
Procedure setProxy(*posts.post_structure,server.s,port.l,login.s="",password.s="")
  *posts\proxy\server=server
  *posts\proxy\port=port
  *posts\proxy\login=login
  *posts\proxy\password=password
EndProcedure


Procedure setHttpPostUrl(*posts.post_structure,url.s)
  *posts\url=url
EndProcedure

;add a variable to the Post Data List
Procedure addHttpPostVariable(*posts.post_structure,name.s,value.s)
  AddElement(*posts\variable())
  *posts\variable()\name=name
  *posts\variable()\value=value
EndProcedure

;add a file to the Post Data List
Procedure addHttpPostfiles(*posts.post_structure,file.s,actionName.s="file")
  If FileSize(file)>0
    AddElement(*posts\file())
    *posts\file()\path=file
    *posts\file()\actionName=actionName
    *posts\file()\mime="text/plain";GetMimeType(GetExtensionPart(file))
    ProcedureReturn #True
  EndIf
  ProcedureReturn #False 
EndProcedure

Macro addtoMemorie(__txt)
  msize.l=MemorySize(*buffer)
  ;If msize=1:msize=0:EndIf
  newmsize=msize+StringByteLength(__txt,#PB_Ascii)
  *buffer=ReAllocateMemory(*buffer,newmsize)
  Debug PeekS(*buffer,MemorySize(*buffer),#PB_Ascii)
  PokeS(*buffer+msize-1,__txt,StringByteLength(__txt,#PB_Ascii),#PB_Ascii)
EndMacro

Procedure.s sendHttpDatas(*posts.post_structure)
  Protected url.s,path.s,port.l,connection.i,f.i,POST.s,BOUNDARY.s
  url = GetURLPart(*posts\url, #PB_URL_Site); the main domain
  path =GetURLPart(*posts\url,#PB_URL_Path); the path
  port= Val(GetURLPart(*posts\url, #PB_URL_Port))
  If port=0:port=80:EndIf
  POST=""
  BOUNDARY = "-----------------------------306262331012750" ;http://www.w3.org/Protocols/rfc1341/7_2_Multipart.html
  Lenght.l=0 ;
  
  
  Debug "Connection opened ..."
  *buffer=AllocateMemory(1)
  
  ;-Send Variable
  ;http://www.purebasic.fr/english/viewtopic.php?f=13&t=13759
  If ListSize(*posts\variable())
    addtoMemorie(#CRLF$)
    addtoMemorie("--"+BOUNDARY+#CRLF$)
    size.l=MemorySize(*buffer)
    ForEach *posts\variable()
      addtoMemorie("Content-Disposition: form-Data; name="+Chr(34)+*posts\variable()\name+Chr(34)+#CRLF$)
      addtoMemorie(#CRLF$)
      addtoMemorie(*posts\variable()\value+#CRLF$)
      addtoMemorie("--"+BOUNDARY+#CRLF$)
    Next
    Lenght+MemorySize(*buffer)-size
  EndIf
  
    
  ;-Send File
  If ListSize(*posts\file())
    addtoMemorie(#CRLF$)
  ForEach *posts\file()
    
    f = OpenFile(#PB_Any, *posts\file()\path)
    
    If f
      
      Debug "send file:"+GetFilePart(*posts\file()\path)
      fileHeader.s="Content-Disposition: form-data; name="+Chr(34)+*posts\file()\actionName+Chr(34) +"; filename="+Chr(34)+*posts\file()\path+Chr(34)+#CRLF$
      fileHeader+"Content-Type: application/octet-stream" + #CRLF$ + #CRLF$
      Lenght+(Lof(f)+2*Len(BOUNDARY)+Len(fileHeader)+10)
      addtoMemorie(#CRLF$)
      addtoMemorie("--"+BOUNDARY+#CRLF$+fileHeader)
      ;addfile content
      size.l=MemorySize(*buffer)
      If size=1:size=0:EndIf
      *buffer=ReAllocateMemory(*buffer,size+Lof(f))
      ReadData(f, *buffer+size, Lof(f))
      
      
      addtoMemorie(#CRLF$ + "--" + BOUNDARY + "--")
      
      CloseFile(f)
    Else
      MessageRequester("Error","File No Found :"+#CRLF$+*posts\file()\path,#PB_MessageRequester_Ok)
    EndIf
    
  Next
  EndIf
  Debug PeekS(*buffer,MemorySize(*buffer),#PB_Ascii)
  
  ;-TEST SI PROXY
  ;http://www.purebasic.fr/english/viewtopic.php?f=12&t=10327
  If *posts\proxy\server<>""
    connection = OpenNetworkConnection(*posts\proxy\server, *posts\proxy\port)
    POST + "POST "+*posts\url+" HTTP/1.0"+ #CRLF$
    If *posts\proxy\login<>""
      conc$=*posts\proxy\login+":"+*posts\proxy\password
      *OutputBuffer = AllocateMemory(Len(conc$)*4)
      Base64Encoder(@conc$,Len(conc$),*OutputBuffer,Len(conc$)*4)
      enc$=PeekS(*OutputBuffer)
      FreeMemory(*OutputBuffer)
      
      POST +"Proxy-Authorization: Basic "+enc$+#CRLF$
    EndIf
  Else
    connection = OpenNetworkConnection(url, port)
    POST + "POST "+"/"+path+" HTTP/1.0"+ #CRLF$
  EndIf
  
  POST + "Host: "+url + #CRLF$
  POST + "Content-Type: multipart/form-data; boundary="+BOUNDARY + #CRLF$
  ;POST  + "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.12) Gecko/20050915 Firefox/1.0.7" + #CRLF$
  ;si il y a un acces proteger avec htaccess
  ;POST  + "Authorization: Basic "+ OutputBuffer + #CRLF$
  POST + "Content-Length: "+Str(Lenght) + #CRLF$
  POST + "Connection: keep-alive" + #CRLF$
  If connection 
    
    SendNetworkData(connection, @POST, Len(POST)):
    
    SendNetworkData(connection, *buffer, MemorySize(*buffer)):
    

    string.s = Space(2048)
    result.s=""
    time = ElapsedMilliseconds()
    Repeat
      If NetworkClientEvent(Connection) = #PB_NetworkEvent_Data
        readed = ReceiveNetworkData(connection, @string, 2048)
        result + Left(string, readed)
        time = ElapsedMilliseconds()
      EndIf
      Delay(100)
    Until ElapsedMilliseconds() - time >= 3000

    CreateFile(0,"Debug.txt")
    WriteString(0,result)
    WriteStringN(0,"____________________________")
    WriteString(0,POST)
    WriteData(0,*buffer, MemorySize(*buffer))
    CloseFile(0)
    RunProgram("Debug.txt")
    FreeMemory(*buffer)

    ProcedureReturn result
  Else
    Debug "NO CONNECTION"
    
  EndIf
EndProcedure


InitNetwork()
test.post_structure
setHttpPostUrl(@test,"http://www.thyphoon.com/test.php")
;setProxy(@test,"test.bpi.fr",80)
addHttpPostVariable(@test,"variable","unevaleur")
addHttpPostVariable(@test,"test","reponse")
;addHttpPostfiles(@test,OpenFileRequester("Please choose file to load", "", "*.*", 0),"fileA")
;addHttpPostfiles(@test,OpenFileRequester("Please choose file to load", "", "*.*", 0),"fileB")
sendHttpDatas(@test)
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Envoi de fichier par requête Http Post

Message par Kwai chang caine »

Merci beaucoup TYPHOON de tes explications.
J'ai essayé ton code et j'ai obtenu ça dans un Debug.txt

Code : Tout sélectionner

HTTP/1.1 200 OK
Date: Tue, 28 Jun 2011 07:24:35 GMT
Server: Apache/2.2.17 (Win32) PHP/5.2.14
Last-Modified: Thu, 24 Mar 2011 07:19:21 GMT
ETag: "3000000046913-4f-49f354bd46276"
Accept-Ranges: bytes
Content-Length: 79
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html

<meta http-equiv="refresh" content="0;URL=webcreation/pages/accueil/index.php"><!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>501 Method Not Implemented</title>
</head><body>
<h1>Method Not Implemented</h1>
<p>-------------------------------306262331012750 to /index.htm not supported.<br />
</p>
</body></html>
____________________________
POST / HTTP/1.0
Host: 
Content-Type: multipart/form-data; boundary=-----------------------------306262331012750
Content-Length: 214
Connection: keep-alive

-------------------------------306262331012750
Content-Disposition: form-Data; name="variable"

unevaleur
-------------------------------306262331012750
Content-Disposition: form-Data; name="test"

reponse
-------------------------------306262331012750
Et ça dans le debugger

Code : Tout sélectionner

Connection opened ...




-------------------------------306262331012750


-------------------------------306262331012750
Content-Disposition: form-Data; name="variable"


-------------------------------306262331012750
Content-Disposition: form-Data; name="variable"



-------------------------------306262331012750
Content-Disposition: form-Data; name="variable"

unevaleur


-------------------------------306262331012750
Content-Disposition: form-Data; name="variable"

unevaleur
-------------------------------306262331012750


-------------------------------306262331012750
Content-Disposition: form-Data; name="variable"

unevaleur
-------------------------------306262331012750
Content-Disposition: form-Data; name="test"


-------------------------------306262331012750
Content-Disposition: form-Data; name="variable"

unevaleur
-------------------------------306262331012750
Content-Disposition: form-Data; name="test"



-------------------------------306262331012750
Content-Disposition: form-Data; name="variable"

unevaleur
-------------------------------306262331012750
Content-Disposition: form-Data; name="test"

reponse


-------------------------------306262331012750
Content-Disposition: form-Data; name="variable"

unevaleur
-------------------------------306262331012750
Content-Disposition: form-Data; name="test"

reponse
-------------------------------306262331012750
Je suppose que c'est bon, car j'ai encore quelques lacunes dans le "comprenage" :oops:

Quand tu parles du TMP, c'est lequel,
Celui de la racine "c:\Temp"
Celui de Windows "c:\Windows\Temp"
Celui dans le USER ???

Parce que pas moyen de le trouver ce fichier :(
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Re: Envoi de fichier par requête Http Post

Message par Thyphoon »

apparemment ça n'a pas marché ! il doit encore y avoir un problème dans l'entête !
501 Method Not Implemented
peux tu me dire ce que tu as envoyé ?
la partie en fin de code qui ressemble a ça

Code : Tout sélectionner

;setProxy(@test,"test.bpi.fr",80)
addHttpPostVariable(@test,"variable","unevaleur")
addHttpPostVariable(@test,"test","reponse")
;addHttpPostfiles(@test,OpenFileRequester("Please choose file to load", "", "*.*", 0),"fileA")
;addHttpPostfiles(@test,OpenFileRequester("Please choose file to load", "", "*.*", 0),"fileB")
sendHttpDatas(@test)
je vais testé !
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Envoi de fichier par requête Http Post

Message par Kwai chang caine »

Bah en fait j'ai pas touché ton code
J'ai juste mis l'adresse de mon serveur sans les Http du style "Abc33o3r.domaine.NomEntreprise.fr"
Le serveur est sur une machine a coté de mon PC sur mon bureau donc physiquement accessible
setHttpPostUrl(@test,"ksa21i1z.ntkd0.erdf-grdf.fr")
;setProxy(@test,"test.bpi.fr",80)
addHttpPostVariable(@test,"variable","unevaleur")
addHttpPostVariable(@test,"test","reponse")
;addHttpPostfiles(@test,OpenFileRequester("Please choose file to load", "", "*.*", 0),"fileA")
;addHttpPostfiles(@test,OpenFileRequester("Please choose file to load", "", "*.*", 0),"fileB")
sendHttpDatas(@test)
Edit, j'ai essayé aussi d'envoyer un exe, et il a apparu en TXT 8O
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Re: Envoi de fichier par requête Http Post

Message par Thyphoon »

Kwai chang caine a écrit : Edit, j'ai essayé aussi d'envoyer un exe, et il a apparu en TXT 8O
ça c'est normal ....
ce qui est pas normal c'est la reponse qu'a donné ton serveur
essaye avec cette dernière version
normalement tu as le résultat de ta reuqête qui s'affiche maintenant dans un requester ... et le header envoyé au serveur dans le fichier txt !

sinon ton serveur c'est apache ?

Code : Tout sélectionner

;sendHttpPost
;by Thyphoon 
;but whith help from
;Pantcho => http://www.purebasic.fr/english/viewtopic.php?f=13&t=19714
;lepiaf31
;Djes
;GallyHC
;Ar-S
;And some other people who post some code on French or English forum

Structure post_variable
  name.s    ;Variable Name
  value.s   ;Variable Value
EndStructure

Structure post_file
  actionName.s  ; this is important!! this action must be the same as  <form ... name="file">
  path.s        ; path+filename about file to send
  mime.s        ; mime-type
EndStructure

Structure proxy_structure
  server.s      ;
  port.l        ;
  login.s       ;
  password.s    ;
EndStructure

Structure post_structure
  url.s         ;url to send POST
  proxy.proxy_structure
  List variable.post_variable() ;variables
  List file.post_file() ;files
EndStructure

;Init Url to send Post Data
Procedure setProxy(*posts.post_structure,server.s,port.l,login.s="",password.s="")
  *posts\proxy\server=server
  *posts\proxy\port=port
  *posts\proxy\login=login
  *posts\proxy\password=password
EndProcedure


Procedure setHttpPostUrl(*posts.post_structure,url.s)
  *posts\url=url
EndProcedure

;add a variable to the Post Data List
Procedure addHttpPostVariable(*posts.post_structure,name.s,value.s)
  AddElement(*posts\variable())
  *posts\variable()\name=name
  *posts\variable()\value=value
EndProcedure

;add a file to the Post Data List
Procedure addHttpPostfiles(*posts.post_structure,file.s,actionName.s="file")
  If FileSize(file)>0
    AddElement(*posts\file())
    *posts\file()\path=file
    *posts\file()\actionName=actionName
    *posts\file()\mime="text/plain";GetMimeType(GetExtensionPart(file))
    ProcedureReturn #True
  EndIf
  ProcedureReturn #False
EndProcedure

Macro addtoMemorie(__txt)
  msize.l=MemorySize(*buffer)
  ;If msize=1:msize=0:EndIf
  newmsize=msize+StringByteLength(__txt,#PB_Ascii)
  *buffer=ReAllocateMemory(*buffer,newmsize)
  Debug PeekS(*buffer,MemorySize(*buffer),#PB_Ascii)
  PokeS(*buffer+msize-1,__txt,StringByteLength(__txt,#PB_Ascii),#PB_Ascii)
EndMacro

Procedure.s sendHttpDatas(*posts.post_structure)
  Protected url.s,path.s,port.l,connection.i,f.i,POST.s,BOUNDARY.s
  url = GetURLPart(*posts\url, #PB_URL_Site); the main domain
  path =GetURLPart(*posts\url,#PB_URL_Path); the path
  port= Val(GetURLPart(*posts\url, #PB_URL_Port))
  If port=0:port=80:EndIf
  POST=""
  BOUNDARY = "-----------------------------306262331012750" ;http://www.w3.org/Protocols/rfc1341/7_2_Multipart.html
  Lenght.l=0 ;
 
 
  Debug "Connection opened ..."
  *buffer=AllocateMemory(1)
 
  ;-Send Variable
  ;http://www.purebasic.fr/english/viewtopic.php?f=13&t=13759
  If ListSize(*posts\variable())
    addtoMemorie(#CRLF$)
    addtoMemorie("--"+BOUNDARY+#CRLF$)
    size.l=MemorySize(*buffer)
    ForEach *posts\variable()
      addtoMemorie("Content-Disposition: form-Data; name="+Chr(34)+*posts\variable()\name+Chr(34)+#CRLF$)
      addtoMemorie(#CRLF$)
      addtoMemorie(*posts\variable()\value+#CRLF$)
      addtoMemorie("--"+BOUNDARY+#CRLF$)
    Next
    Lenght+MemorySize(*buffer)-size
  EndIf
 
   
  ;-Send File
  If ListSize(*posts\file())
    addtoMemorie(#CRLF$)
  ForEach *posts\file()
   
    f = OpenFile(#PB_Any, *posts\file()\path)
   
    If f
     
      Debug "send file:"+GetFilePart(*posts\file()\path)
      fileHeader.s="Content-Disposition: form-data; name="+Chr(34)+*posts\file()\actionName+Chr(34) +"; filename="+Chr(34)+*posts\file()\path+Chr(34)+#CRLF$
      fileHeader+"Content-Type: application/octet-stream" + #CRLF$ + #CRLF$
      Lenght+(Lof(f)+2*Len(BOUNDARY)+Len(fileHeader)+10)
      addtoMemorie(#CRLF$)
      addtoMemorie("--"+BOUNDARY+#CRLF$+fileHeader)
      ;addfile content
      size.l=MemorySize(*buffer)
      If size=1:size=0:EndIf
      *buffer=ReAllocateMemory(*buffer,size+Lof(f))
      ReadData(f, *buffer+size, Lof(f))
     
     
      addtoMemorie(#CRLF$ + "--" + BOUNDARY + "--")
     
      CloseFile(f)
    Else
      MessageRequester("Error","File No Found :"+#CRLF$+*posts\file()\path,#PB_MessageRequester_Ok)
    EndIf
   
  Next
  EndIf
  Debug PeekS(*buffer,MemorySize(*buffer),#PB_Ascii)
 
  ;-TEST SI PROXY
  ;http://www.purebasic.fr/english/viewtopic.php?f=12&t=10327
  If *posts\proxy\server<>""
    connection = OpenNetworkConnection(*posts\proxy\server, *posts\proxy\port)
    POST + "POST "+*posts\url+" HTTP/1.0"+ #CRLF$
    If *posts\proxy\login<>""
      conc$=*posts\proxy\login+":"+*posts\proxy\password
      *OutputBuffer = AllocateMemory(Len(conc$)*4)
      Base64Encoder(@conc$,Len(conc$),*OutputBuffer,Len(conc$)*4)
      enc$=PeekS(*OutputBuffer)
      FreeMemory(*OutputBuffer)
     
      POST +"Proxy-Authorization: Basic "+enc$+#CRLF$
    EndIf
  Else
    connection = OpenNetworkConnection(url, port)
    POST + "POST "+"/"+path+" HTTP/1.0"+ #CRLF$
  EndIf
 
  POST + "Host: "+url + #CRLF$
  POST + "Content-Type: multipart/form-data; boundary="+BOUNDARY + #CRLF$
  ;POST  + "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.12) Gecko/20050915 Firefox/1.0.7" + #CRLF$
  ;si il y a un acces proteger avec htaccess
  ;POST  + "Authorization: Basic "+ OutputBuffer + #CRLF$
  POST + "Content-Length: "+Str(Lenght) + #CRLF$
  POST + "Connection: keep-alive" + #CRLF$
  If connection
    *postbuffer=AllocateMemory(StringByteLength(POST,#PB_Ascii))
    PokeS(*postbuffer,POST,StringByteLength(POST,#PB_Ascii),#PB_Ascii)
    SendNetworkData(connection, *postbuffer, MemorySize(*postbuffer)):
    SendNetworkData(connection, *buffer, MemorySize(*buffer)):
   

    string.s = Space(2048)
    result.s=""
    time = ElapsedMilliseconds()
    Repeat
      If NetworkClientEvent(Connection) = #PB_NetworkEvent_Data
        readed = ReceiveNetworkData(connection, @string, 2048)
        result + PeekS(@string,readed,#PB_Ascii);Left(string, readed)
        time = ElapsedMilliseconds()
      EndIf
      Delay(100)
    Until ElapsedMilliseconds() - time >= 3000
    
    ;clear the header
    result=Right(result,Len(result)-FindString(result, #CRLF$+ #CRLF$,0)-3)
      CreateFile(0,"Debug.txt")
    WriteString(0,POST)
    WriteData(0,*buffer, MemorySize(*buffer))
    CloseFile(0)
    RunProgram("Debug.txt")
    FreeMemory(*buffer)
    
    ProcedureReturn result
  Else
    Debug "NO CONNECTION"
   
  EndIf
EndProcedure


InitNetwork()
test.post_structure
setHttpPostUrl(@test,"http://www.thyphoon.com/test.php")
;setProxy(@test,"test.bopi.fr",80)
addHttpPostVariable(@test,"variable","unevaleur")
addHttpPostVariable(@test,"test","reponse")
addHttpPostfiles(@test,OpenFileRequester("Please choose file to load", "", "*.*", 0),"fileA")
addHttpPostfiles(@test,OpenFileRequester("Please choose file to load", "", "*.*", 0),"fileB")
MessageRequester("Result",sendHttpDatas(@test),#PB_MessageRequester_Ok )
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Envoi de fichier par requête Http Post

Message par Kwai chang caine »

Je fais l'essai tout de suite
sinon ton serveur c'est apache ?
Oui, le seul, l'unique, ...le vrai :D
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Envoi de fichier par requête Http Post

Message par Kwai chang caine »

J'ai tout ça comme retour...j'sais pas si j'ai tout juste :oops:
http://erdsjb.free.fr/PureStorage/Provi ... avail1.zip
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Re: Envoi de fichier par requête Http Post

Message par Thyphoon »

essaye en commentant les 2 lignes pour envoyer les fichiers, et envoie juste les varibales voir si tu as la même chose ?
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Envoi de fichier par requête Http Post

Message par Kwai chang caine »

J'ai commenté les deux lignes d'envoi de fichier
http://erdsjb.free.fr/PureStorage/Provi ... avail2.zip
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Re: Envoi de fichier par requête Http Post

Message par Thyphoon »

tu as sur que tes paramètres dans setHttpPostUrl sont bon ?

tu peux essayer avec mon serveur pour voir ?

Code : Tout sélectionner

setHttpPostUrl(@test,"http://www.thyphoon.com/test.php")
addHttpPostVariable(@test,"variable","unevaleur")
addHttpPostVariable(@test,"test","reponse")
MessageRequester("Result",sendHttpDatas(@test),#PB_MessageRequester_Ok )
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Envoi de fichier par requête Http Post

Message par Kwai chang caine »

Apparement ça marche mieux chez toi, bien que j'ai pas encore tout compris :oops:

En plus j'ai un PROXY, et ton code a marché avec lui 8)

http://erdsjb.free.fr/PureStorage/Provi ... avail3.zip
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Envoi de fichier par requête Http Post

Message par Kwai chang caine »

En voyant ton adresse je crois que j'ai compris ou j'ai péché, j'avais pas mis le /test.php :oops:

Je viens d'essayer a nouveau et j'ai reçu ça, je crois que c'est mieux :D
http://erdsjb.free.fr/PureStorage/Provi ... avail4.zip
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
lepiaf31
Messages : 510
Inscription : dim. 25/mars/2007 13:44
Localisation : Toulouse, France
Contact :

Re: Envoi de fichier par requête Http Post

Message par lepiaf31 »

Bon voilà je suis désolé de pas pu avoir aidé plus vite mais ca y est j'ai pondu un code qui facilite l'envoi de requete HTTP :

Code : Tout sélectionner

;*********************************************
;***** Envoi de fichier par requete HTTP *****
;******** Par lepiaf31 le 28/06/2011 *********
;*********************************************


EnableExplicit

Structure HTTP_file
  name.s
  path.s
EndStructure

Structure HTTP_Query
  method.b
  host.s
  port.i
  path.s
  boundary.s
  List headers.s()
  List postData.s()
  List files.HTTP_file()
EndStructure

Enumeration
  #HTTP_METHOD_GET
  #HTTP_METHOD_POST
  #HTTP_METHOD_FILE
EndEnumeration


Procedure HTTP_addQueryHeader(*query.HTTP_Query, name.s, value.s)
  Protected string.s
  
  string = name+": "+value
  AddElement(*query\headers())
  *query\headers() = string
EndProcedure

Procedure HTTP_createQuery(*query.HTTP_Query, method.b, path.s, host.s, port.i=80)
  Protected query.HTTP_Query, result.i
  
  *query\method = method
  *query\host = host
  *query\port = port
  *query\path = path
  
  If method = #HTTP_METHOD_POST
    HTTP_addQueryHeader(*query, "Content-type", "application/x-www-form-urlencoded")
  ElseIf method = #HTTP_METHOD_FILE
    *query\boundary = "----------"+Str(ElapsedMilliseconds())
    HTTP_addQueryHeader(*query, "Content-type", "multipart/form-data; boundary="+*query\boundary)
  EndIf
EndProcedure

Procedure HTTP_addPostData(*query.HTTP_Query, name.s, value.s)
  Protected string.s
  
  If *query\method =#HTTP_METHOD_POST Or *query\method = #HTTP_METHOD_FILE
    string = ReplaceString(URLEncoder(name), "=", "%3D")+"="+ReplaceString(URLEncoder(value), "=", "%3D")
    AddElement(*query\postData())
    *query\postData() = string
    ProcedureReturn 1
  EndIf
  
  ProcedureReturn 0
EndProcedure

Procedure HTTP_addFile(*query.HTTP_Query, name.s, fileName.s)
  If *query\method = #HTTP_METHOD_FILE And FileSize(fileName) > -1
    AddElement(*query\files())
    *query\files()\name = name
    *query\files()\path = fileName
    ProcedureReturn 1
  EndIf
  
  ProcedureReturn 0
EndProcedure

Procedure HTTP_sendQuery(*query.HTTP_Query)
  Protected head.s, postData.s, connection.i, size.i, fileHeaderSize.i, file.i, readed.i, *buffer
  
  ;Methode
  Select *query\method
    Case #HTTP_METHOD_GET
      head = "GET "
    Case #HTTP_METHOD_POST
      head = "POST "
    Case #HTTP_METHOD_FILE
      head = "POST "
  EndSelect
  
  ;En-tetes
  head + *query\path + " HTTP/1.0" + #CRLF$
  head + "Host: " + *query\host + #CRLF$
  ForEach *query\headers()
    head + *query\headers() + #CRLF$
  Next
  
  connection = OpenNetworkConnection(*query\host, *query\port)
  If connection
    Select *query\method
      Case #HTTP_METHOD_GET
        head + #CRLF$
        SendNetworkData(connection, @head, Len(head)*SizeOf(Character))
      
      Case #HTTP_METHOD_POST
        ForEach *query\postData()
          postData + *query\postData() + "&"
        Next
        postData = Left(postData, Len(postData)-1)
        
        head + "Content-Length: "+Str(Len(postData)) + #CRLF$
        head + #CRLF$
        head + postData
        SendNetworkData(connection, @head, Len(head)*SizeOf(Character))
      
      Case #HTTP_METHOD_FILE
        ForEach *query\postData()
          postData + "--"+*query\boundary+#CRLF$
          postData +"Content-Disposition: form-data; name="+Chr(34)+StringField(*query\postData(), 1, "=")+Chr(34)+#CRLF$
          postData + #CRLF$
          postData + StringField(*query\postData(), 2, "=")+#CRLF$
        Next
        
        fileHeaderSize = Len("Content-Disposition: form-data; name="+Chr(34)+Chr(34) +"; filename="+Chr(34)+Chr(34)+#CRLF$+"Content-Type: application/octet-stream" + #CRLF$ + #CRLF$)*SizeOf(Character)
        size = fileHeaderSize * ListSize(*query\files())
        ForEach *query\files()
          size + Len(GetFilePart(*query\files()\path))*SizeOf(Character)
          size + Len(*query\files()\name)*SizeOf(Character)
          size + 4*SizeOf(Character)
          size + FileSize(*query\files()\path)
          size + Len("--"+*query\boundary)*SizeOf(Character)
        Next
        size + Len(postData)*SizeOf(Character)
        size + (2+Len(*query\boundary)+2)*SizeOf(Character)
        
        head + "Content-Length: "+Str(size)+#CRLF$
        head + #CRLF$
        head + postData
        SendNetworkData(connection, @head, Len(head)*SizeOf(Character))
        
        *buffer = AllocateMemory(2048)
        ForEach *query\files()
          postData = "--"+*query\boundary+#CRLF$
          postData + "Content-Disposition: form-data; name="+Chr(34)+*query\files()\name+Chr(34) +"; filename="+Chr(34)+GetFilePart(*query\files()\path)+Chr(34)+#CRLF$
          postData + "Content-Type: application/octet-stream" + #CRLF$ + #CRLF$
          SendNetworkData(connection, @postData, Len(postData)*SizeOf(Character))
          file = OpenFile(#PB_Any, *query\files()\path)
          
          If file
            While Eof(file) = 0
              readed = ReadData(file, *buffer, 2048)
              SendNetworkData(connection, *buffer, readed)
            Wend
            CloseFile(file)
          EndIf
       Next
       FreeMemory(*buffer)
       
       postData = #CRLF$+"--"+*query\boundary+"--"
       SendNetworkData(connection, @postData, Len(postData)*SizeOf(Character))
    EndSelect
    
    ProcedureReturn connection
  EndIf
  
  ProcedureReturn 0
EndProcedure

Procedure main()
  Protected test.HTTP_Query, string.s, readed.i, conn.i, time.i
  OpenConsole()
  InitNetwork()
  
  HTTP_createQuery(@test, #HTTP_METHOD_FILE, "/test.php", "www.thyphoon.com")
  HTTP_addQueryHeader(@test, "User-Agent", "PB")
  HTTP_addPostData(@test, "pseudo", "lepiaf31")
  HTTP_addPostData(@test, "nom", "Kevin")
  HTTP_addFile(@test, "datafile", "envoi.txt")
  conn = HTTP_sendQuery(@test)
  
  string.s = Space(2048)
  time = ElapsedMilliseconds()
  Repeat
    If NetworkClientEvent(conn) = #PB_NetworkEvent_Data
      readed = ReceiveNetworkData(conn, @string, 2048)
      Print(Left(string, readed))
      time = ElapsedMilliseconds()
    EndIf
    Delay(100)
  Until ElapsedMilliseconds() - time >= 3000
  Input()
EndProcedure

main()
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Re: Envoi de fichier par requête Http Post

Message par Thyphoon »

lepiaf31 a écrit :Bon voilà je suis désolé de pas pu avoir aidé plus vite mais ca y est j'ai pondu un code qui facilite l'envoi de requete HTTP :
Merci c'est génial ! tu n'as pas a être désolé surtout vu le résultat ! C'est plus propre que ce que j'avais fais ! :mrgreen: lollllll
juste un truc, tu pourrais rajouter le passage part un proxy ? :roll:
Dernière modification par Thyphoon le mar. 28/juin/2011 12:27, modifié 1 fois.
Répondre