Envoi de fichier par requête Http Post
-
- Messages : 510
- Inscription : dim. 25/mars/2007 13:44
- Localisation : Toulouse, France
- Contact :
Re: Envoi de fichier par requête Http Post
haaaaaaa peut-etre que je sais attendez 2 min ^^
Re: Envoi de fichier par requête Http Post
après nouveau test, ça marche 

~~~~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
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳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
-
- Messages : 510
- Inscription : dim. 25/mars/2007 13:44
- Localisation : Toulouse, France
- Contact :
Re: Envoi de fichier par requête Http Post
C'est bon voilà un code qui pète le feu
:

Code : Tout sélectionner
;*********************************************
;***** Envoi de fichier par requete HTTP *****
;******** Par lepiaf31 le 26/06/2011 *********
;*********************************************
URL.s = "www.thyphoon.com"
PATH.s = "/test.php"
ACTION.s = "datafile"
BOUNDARY.s = "-----------------------------306262331012750"
POST.s = ""
FILE.s = OpenFileRequester("Please choose file to load", "", "*.*", 0)
OpenConsole()
If InitNetwork()
PrintN("Network initialised ...")
connection = OpenNetworkConnection(URL, 80)
If connection
PrintN("Connection opened ...")
f = OpenFile(#PB_Any, FILE)
If f
fileHeader.s = "Content-Disposition: form-data; name="+Chr(34)+ACTION+Chr(34) +"; filename="+Chr(34)+FILE+Chr(34)+#CRLF$
fileHeader + "Content-Type: application/octet-stream" + #CRLF$ + #CRLF$
POST = "POST "+PATH+" HTTP/1.0"+ #CRLF$
POST + "Host: "+URL + #CRLF$
POST + "Connection: keep-alive" + #CRLF$
POST + "Content-Type: multipart/form-data; boundary="+BOUNDARY + #CRLF$
POST + "Content-Length: "+Str(FileSize(FILE)+2*Len(BOUNDARY)+Len(fileHeader)+10) + #CRLF$
POST + #CRLF$
POST + "--"+BOUNDARY+#CRLF$+fileHeader
SendNetworkData(connection, @POST, Len(POST))
Debug POST
*buffer = AllocateMemory(2048)
While Eof(f) = 0
readed = ReadData(f, *buffer, 2048)
SendNetworkData(connection, *buffer, readed)
Wend
POST = #CRLF$ + "--" + BOUNDARY + "--"
SendNetworkData(connection, @POST, Len(POST))
FreeMemory(*buffer)
CloseFile(f)
string.s = Space(2048)
time = ElapsedMilliseconds()
Repeat
If NetworkClientEvent(Connection) = #PB_NetworkEvent_Data
readed = ReceiveNetworkData(connection, @string, 2048)
PrintN(Left(string, readed))
time = ElapsedMilliseconds()
EndIf
Delay(100)
Until ElapsedMilliseconds() - time >= 3000
Else
PrintN("File not found")
EndIf
Else
PrintN("Impossible to etablished the connection")
EndIf
Else
PrintN("InitNetwok problem")
EndIf
Input()
Re: Envoi de fichier par requête Http Post
ça marche du feu de dieu !lepiaf31 a écrit :C'est bon voilà un code qui pète le feu:

puisque tu m'as l'air super calé sur le sujet...
j'essaye de me faire un code me permettant d'envoyer plusieurs fichier et variable d'un coup ...
il faut maintenant que j'intègre ton code dedans,
sais tu comment intégré une variable a l'envoie ?
et je comprends pas très bien le principe des BOUNDARY ! si tu peux juste me mettre sur la piste déjà ça sera super !
Code : Tout sélectionner
Structure post_variable
name.s
value.s
EndStructure
Structure post_file
actionName.s ; this is important!! this action must be the same as <form ... name="file">
path.s
mime.s
EndStructure
Structure post_structure
url.s
List variable.post_variable()
List file.post_file()
EndStructure
Procedure setHttpPostUrl(*post.post_structure,url.s)
*post\url=url
EndProcedure
Procedure addHttpPostfiles(*post.post_structure,file.s,actionName.s="file")
If FileSize(file)>0
AddElement(*post\file())
*post\file()\path=file
*post\file()\actionName=actionName
*post\file()\mime="text/plain";GetMimeType(GetExtensionPart(file))
ProcedureReturn #True
EndIf
ProcedureReturn #False
EndProcedure
Procedure sendHttpFile(*post.post_structure)
url.s = GetURLPart(*post\url, #PB_URL_Site); the main domain
port.l= Val(GetURLPart(*post\url, #PB_URL_Port))
If port=0:port=80:EndIf
;-Send Variable
ForEach *post\variable()
Next
;-Send File
ForEach *post\file()
Next
If InitNetwork()
cnx = OpenNetworkConnection(url,80)
If cnx
Else
Debug "NO CONNECTION"
EndIf
EndIf
EndProcedure
post.post_structure
setHttpPostUrl(@post,"http://127.0.0.1/test.php")
addHttpPostfiles(@post,"C:\test.txt")
sendHttpFile(@post)
-
- Messages : 510
- Inscription : dim. 25/mars/2007 13:44
- Localisation : Toulouse, France
- Contact :
Re: Envoi de fichier par requête Http Post
Heu ouep je regarde ca un peu plus tard là jsuis un peu occupé (je mate un live de SC2 pour ceux qui connaissent
)

Re: Envoi de fichier par requête Http Post
merci c'est sympa ! je vais quand même essayer de mon côtélepiaf31 a écrit :Heu ouep je regarde ca un peu plus tard là jsuis un peu occupé (je mate un live de SC2 pour ceux qui connaissent)

Bon StarCraft 2 alors !!

Re: Envoi de fichier par requête Http Post
Pfff
là je que je me suis dit que je suis vraiment un bleu ... même pas capable d'intégrer un code qui fonctionne a mon propre code lollllll
voilà mon code... l'idée est de pouvoir envoyé facilement un fichier et quelques variable
le principe : On rajoute a une liste les fichiers et les variables avec leur valeurs et ensuite on envoi le tout
mais même avec juste qu'un fichier ça ne marche pas ... pourtant j'ai essayer de suivre ce qu'a fait lepiaf31...
Grrrrr


voilà mon code... l'idée est de pouvoir envoyé facilement un fichier et quelques variable
le principe : On rajoute a une liste les fichiers et les variables avec leur valeurs et ensuite on envoi le tout
mais même avec juste qu'un fichier ça ne marche pas ... pourtant j'ai essayer de suivre ce qu'a fait lepiaf31...
Grrrrr

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 post_structure
url.s ;url to send POST
List variable.post_variable() ;variables
List file.post_file() ;files
EndStructure
;Init Url to send Post Data
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
;Send Data List to the url
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 = "POST "+"/"+path+" HTTP/1.0"+ #CRLF$
POST + "Host: "+url + #CRLF$
POST + "Connection: keep-alive" + #CRLF$
BOUNDARY = "-----------------------------306262331012750"
connection = OpenNetworkConnection(URL, port)
If connection
Debug "Connection opened ..."
;-Send Variable
ForEach *posts\variable()
Debug "send variable:"+*posts\variable()\name+"="+*posts\variable()\value
;-TODO
Next
;-Send File
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$
POST + "Content-Type: multipart/form-data; boundary="+BOUNDARY + #CRLF$
POST + "Content-Length: "+Str(FileSize(*posts\file()\path)+2*Len(BOUNDARY)+Len(fileHeader)+10) + #CRLF$
POST + #CRLF$
POST + "--"+BOUNDARY+#CRLF$+fileHeader
SendNetworkData(connection, @POST, Len(POST))
*buffer = AllocateMemory(2048)
While Eof(f) = 0
readed = ReadData(f, *buffer, 2048)
SendNetworkData(connection, *buffer, readed)
Wend
POST = #CRLF$ + "--" + BOUNDARY + "--"
SendNetworkData(connection, @POST, Len(POST))
FreeMemory(*buffer)
CloseFile(f)
Else
MessageRequester("Error","File No Found :"+#CRLF$+*posts\file()\path,#PB_MessageRequester_Ok)
EndIf
POST="";reset variablefor next loop
Next
;-server Answer
string.s = Space(2048)
result.s=""
Repeat
readed = ReceiveNetworkData(connection, @string, 2048)
result+Left(string, readed)
Delay(100)
Until readed < 2048
Debug"____"
ProcedureReturn result
Else
Debug "NO CONNECTION"
EndIf
EndProcedure
InitNetwork()
test.post_structure
setHttpPostUrl(@test,"http://www.thyphoon.com/test.php")
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)
-
- Messages : 510
- Inscription : dim. 25/mars/2007 13:44
- Localisation : Toulouse, France
- Contact :
Re: Envoi de fichier par requête Http Post
Je n'ai pas vraiment regardé ton code (la finale de SC2 n'est toujours pas finie :p) mais je te conseille de remplacer ca:
par ca :
Car parfois il arrive que le serveur mette du temps à répondre et du coup le programme s'arrete trop vite (il n'existe malheureusement pas de fonction en PB natif pour savoir quand le connexion se termine). Du coup je conseille plutot de mettre un timeout à 3 secondes pour être sûr de recevoir toute la page HTML.
JE regarderai avec plus d'attention un peu plus tard si je peux
Code : Tout sélectionner
Repeat
readed = ReceiveNetworkData(connection, @string, 2048)
result+Left(string, readed)
Delay(100)
Until readed < 2048
Code : Tout sélectionner
time = elapsedmilliseconds()
Repeat
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
JE regarderai avec plus d'attention un peu plus tard si je peux

Re: Envoi de fichier par requête Http Post
ba merci de pensé a moi pendant pa pause pub lollllllepiaf31 a écrit :Je n'ai pas vraiment regardé ton code (la finale de SC2 n'est toujours pas finie :p)


en tout cas c'est très sympa
Effectivement tu as raison du coup j'arrive de nouveau a envoyer un fichier, et du coup je comprends mieux l’intérêt d'un code vu sur le forum anglaislepiaf31 a écrit : Car parfois il arrive que le serveur mette du temps à répondre et du coup le programme s'arrete trop vite (il n'existe malheureusement pas de fonction en PB natif pour savoir quand le connexion se termine). Du coup je conseille plutot de mettre un timeout à 3 secondes pour être sûr de recevoir toute la page HTML.
http://www.purebasic.fr/english/viewtop ... 12&t=42559
faudra d'ailleur que je regarde ça de plus prêt demain
Je veux bien, je n'ai pas encore réussit a envoyer 2 fichiers en même temps , ni a rajouter des variables !lepiaf31 a écrit : JE regarderai avec plus d'attention un peu plus tard si je peux

-
- Messages : 510
- Inscription : dim. 25/mars/2007 13:44
- Localisation : Toulouse, France
- Contact :
Re: Envoi de fichier par requête Http Post
Oui en effet je préfère aussi utilisé les sockets mais je ne les utilise que sous Windows donc je ne sais pas si tu cherches du code portable ou pas ?
Re: Envoi de fichier par requête Http Post
oui j'aimerais réussir a avoir un code cross-plateforme vu que j'en aurais besoin sous linux, windows, et MacOslepiaf31 a écrit :Oui en effet je préfère aussi utilisé les sockets mais je ne les utilise que sous Windows donc je ne sais pas si tu cherches du code portable ou pas ?

Re: Envoi de fichier par requête Http Post
bon j'ai voulu avancé ce matin pour essayer d'intégré les variables mais je me suis trouvé confronté a un autre problème... aujourd'hui je suis derrière un proxy. j'ai esayé de trouver de la doc... mais ça ne fonctionne pas ...je continuer de chercher mais je poste la dernière version de mon code ici
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
;Send Data List to the url
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=""
POST + "POST "+"/"+path+" HTTP/1.0"+ #CRLF$
;-TEST SI PROXY
If *posts\proxy\server<>""
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
POST + "Host: "+url + #CRLF$
POST + "Connection: keep-alive" + #CRLF$
BOUNDARY = "-----------------------------306262331012750" ;http://www.w3.org/Protocols/rfc1341/7_2_Multipart.html
connection = OpenNetworkConnection(URL, port)
If connection
Debug "Connection opened ..."
;-Send Variable
ForEach *posts\variable()
Debug "send variable:"+*posts\variable()\name+"="+*posts\variable()\value
;-TODO
Next
;-Send File
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$
POST + "Content-Type: multipart/form-data; boundary="+BOUNDARY + #CRLF$
POST + "Content-Length: "+Str(FileSize(*posts\file()\path)+2*Len(BOUNDARY)+Len(fileHeader)+10) + #CRLF$
POST + #CRLF$
POST + "--"+BOUNDARY+#CRLF$+fileHeader
Debug POST
SendNetworkData(connection, @POST, Len(POST))
*buffer = AllocateMemory(2048)
While Eof(f) = 0
readed = ReadData(f, *buffer, 2048)
SendNetworkData(connection, *buffer, readed)
Wend
POST = #CRLF$ + "--" + BOUNDARY + "--"
SendNetworkData(connection, @POST, Len(POST))
FreeMemory(*buffer)
CloseFile(f)
Else
MessageRequester("Error","File No Found :"+#CRLF$+*posts\file()\path,#PB_MessageRequester_Ok)
EndIf
POST="";reset variablefor next loop
Next
;-server Answer
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
Debug"____"
ProcedureReturn result
Else
Debug "NO CONNECTION"
EndIf
EndProcedure
InitNetwork()
test.post_structure
setHttpPostUrl(@test,"http://www.thyphoon.com/test.php")
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)
Re: Envoi de fichier par requête Http Post
Yeaaaaaaaaaaaah j'ai réussi a passer a travers le proxy
voici mon code ... me reste donc juste la possibilité d'envoyé plusieurs variables/fichier qui ne fonctionne pas et ma commande sera parfaite !!
EDIT: mise à jour du code
voici mon code ... me reste donc juste la possibilité d'envoyé plusieurs variables/fichier qui ne fonctionne pas et ma commande sera parfaite !!

EDIT: mise à jour du code
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
;Send Data List to the url
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=""
;-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 + "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 + "Connection: keep-alive" + #CRLF$
BOUNDARY = "-----------------------------306262331012750" ;http://www.w3.org/Protocols/rfc1341/7_2_Multipart.html
If connection
Debug "Connection opened ..."
;-Send Variable
;http://www.purebasic.fr/english/viewtopic.php?f=13&t=13759
If ListSize(*posts\variable())
variable.s=""
ForEach *posts\variable()
Debug "send variable:"+*posts\variable()\name+"="+*posts\variable()\value
If ListIndex(*posts\variable())>0
variable+"&"
EndIf
variable+*posts\variable()\name+"="+*posts\variable()\value
;-TODO
Next
POST + "Cache-Control: max-age=0" + Chr(13) + Chr(10)
POST + "Content-Type: application/x-www-form-urlencoded" + Chr(13) + Chr(10)
POST + "Content-Length: " + Str(Len(variable)) + Chr(13) + Chr(10)
POST + Chr(13) + Chr(10)
POST + post$
EndIf
;-Send File
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$
POST + "Content-Type: multipart/form-data; boundary="+BOUNDARY + #CRLF$
POST + "Content-Length: "+Str(FileSize(*posts\file()\path)+2*Len(BOUNDARY)+Len(fileHeader)+10) + #CRLF$
POST + #CRLF$
POST + "--"+BOUNDARY+#CRLF$+fileHeader
Debug POST
SendNetworkData(connection, @POST, Len(POST))
*buffer = AllocateMemory(2048)
While Eof(f) = 0
readed = ReadData(f, *buffer, 2048)
SendNetworkData(connection, *buffer, readed)
Wend
POST = #CRLF$ + "--" + BOUNDARY + "--"
SendNetworkData(connection, @POST, Len(POST))
FreeMemory(*buffer)
CloseFile(f)
Else
MessageRequester("Error","File No Found :"+#CRLF$+*posts\file()\path,#PB_MessageRequester_Ok)
EndIf
POST="";reset variablefor next loop
Next
;-server Answer
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
Debug"____"
ProcedureReturn result
Else
Debug "NO CONNECTION"
EndIf
EndProcedure
InitNetwork()
test.post_structure
setHttpPostUrl(@test,"http://www.thyphoon.com/test.php")
setProxy(@test,"spxy.bpi.fr",3128)
addHttpPostVariable(@test,"variable","unevaleur")
;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)
Re: Envoi de fichier par requête Http Post
j'ai réécris le code ! j'arrive a envoyer plusieurs fichier ... mais j'ai toujours des problèmes avec les variables .. je comprends pas pourquoi

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)
Debug "size:"+Str(size)
If msize=1:msize=0:EndIf
newmsize=msize+StringByteLength(__txt,#PB_Ascii)
*buffer=ReAllocateMemory(*buffer,newmsize)
Debug Str(newmsize)+":"+__txt
PokeS(*buffer+msize,__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())
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
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
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
CreateFile(0,"Debug.txt")
SendNetworkData(connection, @POST, Len(POST)):
WriteString(0,POST)
SendNetworkData(connection, *buffer, MemorySize(*buffer)):
Debug PeekS(*buffer,MemorySize(*buffer),#PB_Ascii)
WriteData(0,*buffer, MemorySize(*buffer))
CloseFile(0)
RunProgram("Debug.txt")
FreeMemory(*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
Debug"____"
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")
MessageRequester("result",sendHttpDatas(@test),#PB_MessageRequester_Ok)
- Kwai chang caine
- Messages : 6989
- Inscription : sam. 23/sept./2006 18:32
- Localisation : Isere
Re: Envoi de fichier par requête Http Post
Bonjour à tous les deux
Je m'excuse de m'inserer au milieu de votre super experience qui m'interesse au plus haut point
Seulement comme dab, j'ai les billes dans les mains et je sais pas jouer, j'ai pas compris comment tester ces codes
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 ??
Merci
Je m'excuse de m'inserer au milieu de votre super experience qui m'interesse au plus haut point

Seulement comme dab, j'ai les billes dans les mains et je sais pas jouer, j'ai pas compris comment tester ces codes

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 ??

Merci
