Das OFFIZIELLE PROFAN SUPPORT FORUM
Einsteigerfragen
PROFAN-Programmierung
Helfer & Tools
Anregungen & Vorschläge
PROFAN-NEWS
Die Regeln!
2 - PROFAN-Programmierung

 Neues Thema  |  Zur Übersicht  |  Suchen  |  Einloggen   Vorherige Nachricht  |  Nächste Nachricht 
 Quellcodes
Autor: Matthias Griesbach (---.customers.d1-online.com)
Datum:   14.06.14 17:49

Folgende Quellcodes habe ich bis jetzt am laufen.

Zuerst das Upload PHP-Script für den Webserver

<?PHP
 //echo 'Datei: '.$_FILES["userfile"]["name"];
 //echo 'Datei: '.$_FILES["userfile"]["size"];
 if (move_uploaded_file($_FILES["userfile"]["tmp_name"], $_FILES["userfile"]["name"])) {
 echo 'succsess';
 }
 else 
 {
 echo 'error 200';
 }
 ?>


Für Profan dann einmal die Header Datei WinHttp.ph
INTERNET_SCHEME_HTTP                   = 1;
 INTERNET_SCHEME_HTTPS                  = 2;
 INTERNET_DEFAULT_HTTP_PORT             = 80;
 INTERNET_DEFAULT_HTTPS_PORT            = 443;
  
 WINHTTP_NO_PROXY_NAME                  = 0;
 WINHTTP_NO_PROXY_BYPASS                = 0;
 WINHTTP_NO_REFERER                     = 0;
 WINHTTP_NO_HEADER_INDEX                = 0;
 WINHTTP_DEFAULT_ACCEPT_TYPES           = 0;
 WINHTTP_ACCESS_TYPE_DEFAULT_PROXY      = 0;
 WINHTTP_HEADER_NAME_BY_INDEX           = 0;
 WINHTTP_NO_ADDITIONAL_HEADERS          = 0;
 WINHTTP_NO_REQUEST_DATA                = 0;
 WINHTTP_ACCESS_TYPE_DEFAULT_PROXY      = 0;
  
 WINHTTP_AUTH_TARGET_SERVER             = 0;
 WINHTTP_AUTH_TARGET_PROXY              = 1;
  
 WINHTTP_AUTH_SCHEME_BASIC              = 1;
 WINHTTP_AUTH_SCHEME_NTLM               = 2;
 WINHTTP_AUTH_SCHEME_PASSPORT           = 4;
 WINHTTP_AUTH_SCHEME_DIGEST             = 8;
 WINHTTP_AUTH_SCHEME_NEGOTIATE          = 16;
  
 WINHTTP_OPTION_REDIRECT_POLICY                         = 88;
 WINHTTP_OPTION_REDIRECT_POLICY_NEVER                   = 0;
 WINHTTP_OPTION_REDIRECT_POLICY_DISALLOW_HTTPS_TO_HTTP  = 1;
 WINHTTP_OPTION_REDIRECT_POLICY_ALWAYS                  = 2;
  
 WINHTTP_QUERY_STATUS_CODE              = 19;
 WINHTTP_QUERY_RAW_HEADERS_CRLF         = 22;
 WINHTTP_QUERY_CONTENT_ENCODING         = 29;
 WINHTTP_QUERY_LOCATION                 = 33;
 WINHTTP_QUERY_FLAG_NUMBER              = $20000000;
 WINHTTP_QUERY_CONTENT_LENGTH           = 5;
  
 WINHTTP_OPTION_USERNAME                = $1000;
 WINHTTP_OPTION_PASSWORD                = $1001;
  
 WINHTTP_FLAG_REFRESH                   = $00000100;
 WINHTTP_FLAG_SECURE                    = $00800000;
  
 WINHTTP_ADDREQ_FLAG_ADD                = $20000000;
 
 WINHTTP_RETURNTYPE_MEMORY;
 WINHTTP_RETURNTYPE_FILE;
 


Dann die Include Datei mit den Funktionen WinHttp.inc
'Eine Struktur aus der Vorlage, noch nicht Profan angepasst
 
 'Structure WinHTTP_ParametersStruc
   'URL.s
  'RequestType.s
   'ReturnHeader.i
  ' UserName.s
  ' Password.s
  ' HeaderData.s
   'OptionalData.s
   'UserAgent.s
  ' CallbackID.i
  ' *CallbackStart
  ' *CallbackProgress
  ' *CallbackEnd
  ' *Memory
  ' FilePath.s
  ' FileBufferSize.i
 'EndStructure
 
 
 'Ein paar Variablen
 Declare WinHttp&,hInternet&, hSession&, hConnect&, hRequest&, bResults&
 
 'Init Prozedur. "P" mit "*" ersetzen, und Zeile Listbox entkommentieren, um alle Funktionen anzusehen
 Proc WinHttpInit
   WinHttp&=ImportDLL("winhttp.dll", "P")
   'ListBox$("Funktionen",1)
 EndProc
 
 'Exit Prozedur
 Proc WinHttpEnd
   FreeDll WinHttp&
 EndProc
 
 'Prozedur zum Starten einer Session
 Proc HttpOpen
   Parameters name$
   Declare ansistring#,widestring#,size&,wsize&,i&
   size&=Len(name$)+1
   Dim ansistring#,size&
   String ansistring#,0=name$
   i&=size&*2
   Dim widestring#,i&
   wsize&=(size&*2)+1
   MultiByteToWideChar(1,1,ansistring#,size&,widestring#,wsize&)
   hSession& = PWinHttpOpen(Addr(widestring#),~WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,~WINHTTP_NO_PROXY_NAME,~WINHTTP_NO_PROXY_BYPASS,0)
   CaseNot  hSession& :Return "Session: "+str$(~GetLastError())+" - "+WinError$(%WinError)
   Return "Session established"
 EndProc
 
 'Prozedur um eine Verbundung zum Webserver (Domain) herzustellen
 Proc HttpConnect
   Parameters name$
   Declare ansistring#,widestring#,size&,wsize&,i&
   size&=Len(name$)+1
   Dim ansistring#,size&
   String ansistring#,0=name$
   i&=size&*2
   Dim widestring#,i&
   wsize&=(size&*2)+1
   MultiByteToWideChar(1,1,ansistring#,size&,widestring#,wsize&)
   hConnect& = PWinHttpConnect(hSession&,addr(widestring#),~INTERNET_DEFAULT_HTTP_PORT, 0)
   CaseNot  hConnect& :Return "Connect: "+str$(~GetLastError())+" - "+WinError$(%WinError)
   Return "Connection established"
   Dispose ansistring#
   Dispose widestring#
 EndProc
 
 'Prozedur um einen Request zu erstellen.
 Proc HttpRequest
   Parameters verb$, objekt$, types$
   Declare ansistring#,widestring#,widestring2#,size&,wsize&,wsize2&,i&
   size&=Len(objekt$)+1
   Dim ansistring#,size&
   String ansistring#,0=objekt$
   i&=size&*2
   Dim widestring#,i&
   wsize&=(size&*2)+1
   Dim widestring2#,len(verb$)+1
   MultiByteToWideChar(1,1,ansistring#,size&,widestring#,wsize&)
   Dispose ansistring#
   size&=Len(verb$)+1
   Dim ansistring#,size&
   String ansistring#,0=verb$
   'String widestring2#,0=verb$
   CaseNot verb$:verb$="GET"  
   MultiByteToWideChar(1,1,ansistring#,size&,widestring2#,wsize&)
   hRequest& = PWinHttpOpenRequest( hConnect&, addr(widestring2#) ,addr(widestring#),0,~WINHTTP_NO_REFERER,~WINHTTP_DEFAULT_ACCEPT_TYPES,0) '~NULL objekt$ addr(widestring#) addr(widestring2#)
   CaseNot  hRequest& :Return "Request: "+str$(~GetLastError())+" - "+WinError$(%WinError)
   Return "Request opened"
   Dispose ansistring#
   Dispose widestring#
   Dispose widestring2#
 EndProc
 
 'Prozedur um dem Request Header Informationen hinzuzufügen
 Proc HttpAddHeader
   Parameters text$
   Declare ansistring#,widestring#,size&,wsize&,i&
   text$=text$+chr$(13)+chr$(10)
   size&=Len(text$)+1
   Dim ansistring#,size&
   String ansistring#,0=text$
   i&=size&*2
   Dim widestring#,i&
   wsize&=(size&*2)+1  
   MultiByteToWideChar(1,1,ansistring#,size&,widestring#,wsize&)
   CaseNot PWinHttpAddRequestHeaders(hRequest&, addr(widestring#),-1,~WINHTTP_ADDREQ_FLAG_ADD):Return "AddHeader: "+str$(~GetLastError())+WinError$(%WinError)
   Dispose ansistring#
   Dispose widestring#
   Return "Add Header "+text$
 EndProc
 
 'Prozedur um den Request zu senden
 'Der Body Text wird hier mit übergeben.
 Proc HttpSend
   Parameters Text$
   text$=text$
   Declare ansistring#,widestring#,size&,wsize&,i&
   size&=Len(text$)+1
   Dim ansistring#,size&
   String ansistring#,0=text$
   i&=size&*2
   Dim widestring#,i&
   wsize&=(size&*2)+1  
   MultiByteToWideChar(1,1,ansistring#,size&,widestring#,wsize&)
   bResults& = PWinHttpSendRequest( hRequest&,~WINHTTP_NO_ADDITIONAL_HEADERS,0,addr(widestring#), 0,0, 0) '~WINHTTP_NO_REQUEST_DATA addr(widestring#)
   CaseNot  bResults& :Return "Send: "+str$(~GetLastError())+WinError$(%WinError)
   Return "Send Request"
 EndProc 
 
 'Prozedur um Darten auf den Webserver zu schreiben
 Proc HttpWriteData
   Parameters file$
   Declare BytesWritten&, Size&, Buff#
   Size&= FileSize(file$)
   Dim  Buff#, Size&
 
   BlockRead(file$, Buff#, 0, Size&) 
 
   bResults& = PWinHttpWriteData( hRequest&, addr(Buff#), Size&, BytesWritten&)
   CaseNot  bResults& :Return "Write: "+str$(~GetLastError())+WinError$(%WinError)
   Return str$(Size&)+" Bytes written"
   Dispose Buff#                                   
 EndProc
 
 'Prozedur um die Antwort des Servers zu verarbeiten
 'Die Größe des Buffers beruht nur auf einer Annahme.
 Proc HttpReceiveResponse
   Declare Size&,Downloaded&,Buff#
   Dim Buff#,2048
   bResults& = PWinHttpReceiveResponse( hRequest&, 0)
   CaseNot  bResults& :Return "Receive: "+str$(~GetLastError())+WinError$(%WinError)
   'Hier soll eigentlich Size& auf die exakte Buffergröße gesetzt werden
   'Klappt aber nicht.
   PWinHttpQueryDataAvailable( hRequest&, Size&)
   Print str$(Size&)+" Bytes"
   'Da Size& nicht bestückt wird, ersteinmal manuell angeben
   Size&=500
   PWinHttpReadData( hRequest&, addr(Buff#), Size&, Downloaded&)
   Return String$(Buff#,0)
   Dispose Buff#  
 EndProc
 
 'Prozedur um alle HInternet Handels freizugeben.
 Proc HttpClose
   Case hRequest& : PWinHttpCloseHandle(hRequest&)
   Case hConnect& : PWinHttpCloseHandle(hConnect&)
   Case hSession& : PWinHttpCloseHandle(hSession&)
 EndProc
 


Und letztendlich den TestQuellcode WinHttp.prf
'Zur Sicherheit mal alle Windows-Header einbinden
 $H Messages.ph
 $H Windows.ph
 $H COMMCTRL.PH
 
 'Inc und Header für die WinHttp.dll
 $H includes/WinHttp.ph
 $I includes/WinHttp.inc
 
 'Funktionen um Strings in das Unicode-Format zu wandeln.
 'Die WinHttp.dll nimmt nur Uncode Strings an.
 Def MultiByteToWideChar(6) !"KERNEL32","MultiByteToWideChar"
 Def WideCharToMultiByte(8) !"KERNEL32","WideCharToMultiByte"
 
 'Ein paar Variablen
 Declare Ende&, Body$
 
 'Ein Programmfenster
 CLS
 
 'WinHttp.dll laden
 WinHttpInit
 
 'Dll Handle ausgeben
 Print str$(WinHttp&)
 
 'Eine Session starten
 Print HttpOpen("HTTP Profan")+ "("+str$(hSession&)+")"
 
 'Eine Verbindung zum Webserver aufbauen
 Print HttpConnect("localhost")+ "("+str$(hConnect&)+")"
 
 'Einen POST Request anlegen
 Print HttpRequest("POST","kylt/PCR_Upload.php","multipart/form-data")+ "("+str$(hRequest&)+")"
 
 'Header Infos hinzufügen
 Print HttpAddHeader("Content-Type: multipart/form-data; boundary=--AaB03x") 'Boundary ist zwingend anzugeben, wird sonst vom Webserver angemeckert.
 'Print HttpAddHeader("Content-Type: application/x-www-form-urlencoded")
 
 'Das BODY Element aufbauen chr$(13)+chr$(10)=Zeilenumbruch
 Body$="--AaB03x"+chr$(13)+chr$(10)+"_"
 Body$=Body$+"Content-Disposition: form-data; name="+chr$(34)+"data"+chr$(34)+"; filename="+chr$(34)+"kylt-export.csv"+chr$(34)+";"+chr$(13)+chr$(10)+"_"
 Body$=Body$+"Content-Disposition: form-data; name="+chr$(34)+"max_file_size"+chr$(34)+"; value="+chr$(34)+"1000000"+chr$(34)+";"+chr$(13)+chr$(10)+"_"
 Body$=Body$+"Content-Disposition: form-data; name="+chr$(34)+"userfile"+chr$(34)+"; value="+chr$(34)+"C:\\Kylt%20PCR\\kylt-export.csv"+chr$(34)+";"+chr$(13)+chr$(10)+"_"
 'Body$=Body$+"Content-type: text/x-csv "+chr$(34)+"C:\\Kylt%20PCR\\kylt-export.csv"+chr$(34)+";"+chr$(34)+";"+chr$(13)+chr$(10)+"_"
 
 'Body ausgeben
 Print Body$
 
 'Request und Body senden
 Print HttpSend(Body$)
 
 'Daten auf den Server schreiben
 Print HttpWriteData("C:\\Kylt PCR\\kylt-export.csv")
 
 'Response vom Webserver ausgeben
 Print HttpReceiveResponse()
 
 'Alle HInternet Handels freigeben (Session,Connect,Request)
 HttpClose
 
 'Programmschleife - Beenden mit ESC
 WhileNot Ende&
   WaitInput
   Case %key=27: Ende&=1
 EndWhile
 
 'WinHttp.dll entladenladen
 WinHttpEnd
 


Wie schon geschildert funktioniert die Kommunikation schon Grundlegend, aber es hapert noch am erstellen des POST Action Headers / Bodys und des Uploads einer CSV-Datei.

Bitte mal testen, ausprobieren, und mir dann den richtigen Weg aufzeigen.

Beste Grüße
Matthias Griesbach

XProfan X2, Windows 7

 Beitrag beantworten  |  Foren-Liste  |  Alle Antworten   Neuerer Beitrag  |  Älteres Thema 

 Beiträge Autor  Datum
 WinHttp.dll  Neu
Matthias Griesbach 13.06.14 20:28 
 Re: WinHttp.dll  Neu
Maik Borchardt 13.06.14 23:24 
 Quellcodes  Neu
Matthias Griesbach 14.06.14 17:49 
 Re: Quellcodes  Neu
Maik Borchardt 15.06.14 23:30 
 Re: Quellcodes  Neu
Matthias Griesbach 16.06.14 19:23 
 Re: Quellcodes  Neu
Maik Borchardt 16.06.14 21:12 
 Re: Quellcodes  Neu
Matthias Griesbach 16.06.14 21:37 
 Re: Quellcodes  Neu
Maik Borchardt 16.06.14 22:04 
 Re: Quellcodes  Neu
Matthias Griesbach 16.06.14 22:48 
 Re: Quellcodes  Neu
Maik Borchardt 16.06.14 23:09 
 Re: Quellcodes  Neu
Matthias Griesbach 17.06.14 10:54 
 Re: Quellcodes  Neu
Stephan Sonneborn 21.11.19 15:14 
 Quellcodes - WinHttp Header  Neu
Matthias Griesbach 17.06.14 22:00 
 WinHttp Include  Neu
Matthias Griesbach 17.06.14 22:40 
 Re: WinHttp Include  Neu
Maik Borchardt 17.06.14 23:12 
 Re: WinHttp Include  Neu
Matthias Griesbach 18.06.14 00:18 
 WinHttp.dll gibt Antworten  Neu
Matthias Griesbach 17.06.14 23:39 
 Re: WinHttp.dll gibt Antworten  Neu
Maik Borchardt 17.06.14 23:48 
 Re: WinHttp.dll gibt Antworten  Neu
Matthias Griesbach 18.06.14 00:50 
 Re: WinHttp.dll gibt Antworten  Neu
Florian Heuberger 18.06.14 12:46 
 WinHttp.dll öffentlicher Testserver  Neu
Matthias Griesbach 20.06.14 10:12 
 Re: WinHttp.dll öffentlicher Testserver  Neu
Maik Borchardt 21.06.14 00:30 
 Content-Type: application/x-www-form-urlencoded  Neu
Matthias Griesbach 23.06.14 11:33 
 Re: Content-Type: application/x-www-form-urlencoded  Neu
Maik Borchardt 23.06.14 16:46 
 Re: Content-Type: application/x-www-form-urlencoded  Neu
Matthias Griesbach 23.06.14 18:52 


 Foren-Liste  |  Zur Registrierung 
 Benutzerlogin
 Benutzername:
 Passwort:
 Login-Daten speichern:
   
 Passwort vergessen?
E-Mail-Adresse oder Username unten eingeben. Dann wird Dir per e-Mail ein neues Passwort zugeschickt.

phorum.org