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 :

Envoi de fichier par requête Http Post

Message par Thyphoon »

Peut être que comme moi d'autre, on le vieux fantasme d'envoyer un fichier ou des données vers une page web en POST avec PB
J'ai retrouvé ce vieux code de Pantcho et datant de 2006.
Il fonctionne très bien pour envoyer un fichier text, mais pour envoyer une image ça ne marche pas.
Est-ce que parmis vous quelqu'un aurait une idée comment faire ?

mon but etant au final est de pouvoir envoyer un peu n'importe quoi a un formulaire en Post ! Variable/Fichier
edit: et je precise que je veux eviter de passer part des trucs un peu lourd a mon gout comme libcurl

Code : Tout sélectionner

;SRC = http://www.purebasic.fr/english/viewtopic.php?f=13&t=19714&hilit=Upload+file+to+web+trough+POST+command
;################################################################
;# 22/2/2006 - Upload file to web trough POST command | Pantcho #
;################################################################
URL$ = "127.0.0.1" ; the main domain
PATH$ = "/test.php" ; or what ever script that accepts the enctype="multipart/form-data"
FullFileName$ = "c:\pb\text.txt" ; Full path+filename
ActionName$ = "file" ; this is important!! this action must be the same as  <form ... name="file">
FileHeader$ = "Content-Disposition: form-Data; name="+Chr(34)+ActionName$ + Chr(34) +"; filename="+Chr(34)+ FullFileName$+ Chr(34) +#LFCR$
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.
Border$ = "23232323232" ; Border to the file data (Check RFC for more info) 
;RFC ????? Thyphoon :http://www.faqs.org/rfcs/rfc2616.html ???????? or http://www.iprelax.fr/http/1945tm.php

FullFileName$=OpenFileRequester("Please choose file to load", "", "*.*", 0)

If InitNetwork()
  conid.l = OpenNetworkConnection(URL$,80)
  If conid
      Debug "Connected"
      *Buffer = AllocateMemory(100000) ; some memory for our file buffer
      POST$ = "POST "+ PATH$ +" HTTP/1.0"  ; the Post command we are going to send to the server
   
      If OpenFile(1,FullFileName$)
      Repeat
        Text$ = ReadString(1)
        FILE$ + Chr(13) + Chr(10)+Text$
      Until Eof(1)
      ; This is the border header for uploading
      FILE$ = "------"+Border$ + #LFCR$ + FileHeader$ +#LFCR$ + FILE$ + "------" + Border$ + "--"
      ; Back to post, while sending header with the correct content length (border+file+border)
      POST$ + #LFCR$ + "Content-Type: multipart/form-Data, boundary=----"+Border$ + #LFCR$ + "Content-Length: " + Str(Len(FILE$))
      POST$ + #LFCR$ + #LFCR$ + FILE$
      CloseFile(1)
      PokeS(*Buffer,"",0)
      PokeS(*Buffer,POST$,Len(POST$))
      SendNetworkData(conid,*Buffer,Len(POST$))
      If CreateFile(0,"back.txt")
      Repeat
        Server$ = PeekS(*Buffer)
        WriteString(0,Server$)
        res.l = ReceiveNetworkData(conid, *Buffer, 1000)
      Until Server$ = PeekS(*Buffer)
      CloseFile(0)  
    EndIf
    Else
      Debug "Can't Open File"
    EndIf
  Else
    Debug "NO CONNECTION"
  EndIf
EndIf
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Envoi de fichier par requête Http Post

Message par Ar-S »

Non testé mais ne devrais tu pas changer ton ContentType en lui indiquant ContentType="image/tiff" (tiff pour l'exemple pour exemple) ?
~~~~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
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 »

Voilà un code qui permet d'envoyer n'importe quel fichier (normalement ^^) via une requete HTTP :

Code : Tout sélectionner

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


URL.s = "127.0.0.1"
PATH.s = "/test/test.php"
ACTION.s = "file"
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 + "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))

      *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)
      Repeat
        readed = ReceiveNetworkData(connection, @string, 2048)
        PrintN(Left(string, readed))
        Delay(100)
      Until readed < 2048
      
    Else
      PrintN("File not found")
    EndIf
  Else
    PrintN("Impossible to etablished the connection")
  EndIf
Else
  PrintN("InitNetwok problem")
EndIf

Input()
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 »

Ar-S a écrit :Non testé mais ne devrais tu pas changer ton ContentType en lui indiquant ContentType="image/tiff" (tiff pour l'exemple pour exemple) ?
Merci Ar-S effectivement il a bien ça, mais il doit y avoir autre chose
lepiaf31 a écrit :Voilà un code qui permet d'envoyer n'importe quel fichier (normalement ^^) via une requete HTTP :
Génial je me dépêche d'aller tester ça !! merci
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 »

De rien ;) (J'ai testé le code seulement en local avec un txt et une image en png =) )
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 :De rien ;) (J'ai testé le code seulement en local avec un txt et une image en png =) )
effectivement ça marche en local mais pas a distance ...
je me suis fait un truc de test a cette adresse http://www.thyphoon.com/test.php
en manuel ça marche bien avec ton programme j'ai une erreur 404
le seul truc changé a ton code

Code : Tout sélectionner

URL.s = "www.thyphoon.com"
PATH.s = "/test.php"
si jamais tu as une idée ?
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 »

Okay c'est de ma faute j'ai oublié le mettre l'Host dans la requete. Voici le code corrigé:

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 + "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)
      Repeat
        readed = ReceiveNetworkData(connection, @string, 2048)
        PrintN(Left(string, readed))
        Delay(100)
      Until readed < 2048
      
    Else
      PrintN("File not found")
    EndIf
  Else
    PrintN("Impossible to etablished the connection")
  EndIf
Else
  PrintN("InitNetwok problem")
EndIf

Input()
Dis moi si ca marche ;)
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Envoi de fichier par requête Http Post

Message par Ar-S »

Code : Tout sélectionner

Url.s = "80.247.228.60"
c'est mieux comme ça :mrgreen: (ou alors sans les www)
~~~~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
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 »

Je viens de tester sur ton site et ca a l'air de marcher (avec le code que j'ai posté).
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Envoi de fichier par requête Http Post

Message par Ar-S »

Chez moi ça ne fonctionne pas avec les www. devant mais sans, oui.
~~~~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
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 »

Etrange :/ , chez moi ca donne ca:
Image
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 »

voilà le code de la page sur mon serveur

Code : Tout sélectionner

<?php
if ($_SERVER['REQUEST_METHOD']=="POST") {
	echo"POST REQUEST Ok/";
	foreach($_POST as $name=>$value) {
	echo "POST[$name] = $value /";
	}
	echo"___";
	foreach($_GET as $name=>$value) {
	echo "GET[$name] = $value /";
	}
	echo"FILE /";
	var_dump($_FILES);
}
?>
<form action="test.php"
enctype="multipart/form-data" method="post">
<p>
Type some text (if you like):<br>
<input type="text" name="textline" size="30">
</p>
<p>
Please specify a file, or a set of files:<br>
<input type="file" name="datafile" size="40">
</p>
<div>
<input type="submit" value="Send">
</div>
</form>
!
apparemment il reçoit bien une requête POST mais ne detect ou ne reçois aucune varibale et ni aucun fichier !

moi j'ai ça en reponse (et j'ai quitté mon antivirus/firewall au cas ou)
Network initialised ...
Connection opened ...
HTTP/1.1 400 Bad Request
Date: Sun, 26 Jun 2011 15:07:58 GMT
Server: Apache
Content-Length: 226
Connection: close
Content-Type: text/html; charset=iso-8859-1

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>400 Bad Request</title>
</head><body>
<h1>Bad Request</h1>
<p>Your browser sent a request that this server could not understand.<br />
</p>
</body></html>
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 »

As-tu pris le nouveau code que j'ai posté ?
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 :As-tu pris le nouveau code que j'ai posté ?
Oups ! :oops: je reteste ! :mrgreen: vous me répondez trop vite du coup je rate des messages :wink: (je vais pas me plaindre quand même :roll: )
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 »

oui ça marche beaucoup mieux !

mais curieusement il ne detecte pas le fichier qu'on lui envoie ! :cry:
on devrait avoir une reponse du genre
POST REQUEST Ok/POST[textline] = /___FILE /array(1) { ["datafile"]=> array(5) { ["name"]=> string(9) "debug.log" ["type"]=> string(24) "application/octet-stream" ["tmp_name"]=> string(14) "/tmp/phpNG24eE" ["error"]=> int(0) ["size"]=> int(82) } }
Répondre