Autor: Matthias Griesbach (---.customers.d1-online.com)
Datum: 23.06.14 11:33
Ein kleiner Erfolg.
Mit dem Header Content-Type: application/x-www-form-urlencoded
Print HttpAddHeader("Accept: text/html, text/csv, */*\nAccept-Charset: ISO-8859-1,utf-8")
Print HttpAddHeader("Content-Type: application/x-www-form-urlencoded; Charset: utf-8;")
kommen Dateien beim Webserver an, wenn man als Body
Body$="userfile=datei.name&data="
nimmt, und den Inhalt der Datei als ByteString (%21%86 etc.) anhängt.
Proc ByteString
Parameters text$
Declare i&, count&, new$, tmp$
i&=len(text$)
WhileLoop 1,i&
tmp$=hex$(ord(mid$(text$,&loop,1)))
Case len(tmp$)<2:tmp$="0"+tmp$
new$=new$+"%"+tmp$
EndWhile
Return New$
EndProc
Das klappt mit Textdateien, etc.
Bei binären Dateien wei Bilder hilft dann folgende Proc
Proc ReadBmp
Parameters file$
Declare BytesWritten&, Size&, Buff#, Return$, new$,tmp$,i&
Size&= FileSize(file$)
Dim Buff#, Size&
BlockRead(file$, Buff#, 0, Size&)
WhileLoop 0,Size&
tmp$=hex$(ord(CHar$(Buff#,&loop,1)))
Case len(tmp$)<2:tmp$="0"+tmp$
new$=new$+"%"+tmp$
EndWhile
Dispose Buff#
Return New$
EndProc
HttpSend kommt dann ohne Bereichsvariable aus und überträgt den Body sammt ByteString ohne murren. Der String muss auch nicht in einen WideString umgewandelt werden.
Proc HttpSend
Parameters Text$
Declare Size&, Return$
Size&=(Len(Text$)+0)'*2
Return$="Send Request "+format$("0",size&)+" Byte"
bResults& = PWinHttpSendRequest( hRequest&,~WINHTTP_NO_ADDITIONAL_HEADERS,0, Addr(Text$), Size&, Size&, 0) '~WINHTTP_NO_REQUEST_DATA addr(widestring#)
CaseNot bResults& :Return$="Send: "+str$(~GetLastError())+WinError$(%WinError)
Return Return$
EndProc
Einziger Wermutstropfen ist die Beschränkung der Dateigröße. Ein BMP mit 4kB kommt ganz an, einer CSV-Datei mit 6kB fehlen am Ende einige Zeilen.
Hier noch das PHP-Script für den Server
<?PHP
ini_set('default_charset', 'UTF-8');
Echo 'Headers ->';
$headers = apache_request_headers();
foreach ($headers as $name => $value) {
echo $name.': '.$value.'\\n';
}
$file = $_POST["userfile"];
$somecontent = print_r($_POST["data"], TRUE);
$fp = fopen($file, 'w') or die('Could not open file!');
fwrite($fp, $somecontent) or die('Could not write to file');
fclose($fp);
Echo 'userfile='.$_POST["userfile"].'\n';
Echo 'data='.$_POST["data"].'\n';
?>
Die Funktion WinHttpSendRequest aus der WinHttp.dll geht also mit Profan.
Für den Header Content-Type: multipart/form-data muss das auch noch irgendwie gehen.
Richtiger Body aufbau, und die exate Länge, dann sollte das klappen.
Beste Grüße
Matthias Griesbach
XProfan X2, Windows 7