HTTP File Upload by The UnXplAiNED
Post date: Dec 21, 2010 9:36:34 PM
This interesting project, coded in Delphi by The UnXplAiNED, details how to upload a file to a webpage via the HTTP POST method.
Read more:
http://en.wikipedia.org/wiki/POST_(HTTP)
Author: The UnXplAiNED
Website: opensc.ws
Compiled: Delphi 2007
PHP Script:
<?php
$path='./';
move_uploaded_file($_FILES['data']['tmp_name'], $path.$_FILES['data']['name']) or die('');
?>
Delphi Unit:
{
uHttpUploadFile
Author: The UnXplAiNED
Description: Upload a file to a webpage via the HTTP POST method
Website: www.opensc.ws
Credits:
steve10120
datemme(I basically ported and fixed his C version of httpfile upload)
steve10120
LeadMX
Squeezer
Counterstrikewi
Release date: 18/12/2010
Note:
host - should always be in that form, site.com, no http:// infront.
script - should always be preceded by a /, e.g /directory/index.php
filepath - the full path to the file
remotefilename - the name to be given when uploaded
The form upload name used is "data" if you are using a different one
on your webpage, make sure to change it in the function.
No check is done on the response headers to check if the file was uploaded correctly.
}
unit uHttpUploadFile;
interface
uses Windows, WinSock, SysUtils;
function HTTPPostData(host:string;script:string;filePath:string;remoteFilename:String):integer;
var
sSock : TSocket;
sAddr: TSockAddrIn;
sWsa : TWSAData;
sPort : integer = 80;
rturn :integer;
i: Integer;
implementation
//found somewhere on the net
function GetIPFromHost(const HostName: string): string;
type
TaPInAddr = array[0..10] of PInAddr;
PaPInAddr = ^TaPInAddr;
var
phe: PHostEnt;
pptr: PaPInAddr;
i: Integer;
GInitData: TWSAData;
begin
WSAStartup($101, GInitData);
Result := '';
phe := GetHostByName(PChar(HostName));
if phe = nil then Exit;
pPtr := PaPInAddr(phe^.h_addr_list);
i := 0;
while pPtr^[i] <> nil do
begin
Result := inet_ntoa(pptr^[i]^);
Inc(i);
end;
WSACleanup;
end;
//credits to steve10120
function readFiletoString(fpath:string; var fbuffer:string):boolean;
var
fhandle: Thandle;
dSize: DWORD;
dRead: DWORD;
begin
Result:= False;
fhandle := CreateFile(PChar(fpath), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, 0, 0);
if fhandle <> 0 then
begin
dSize := GetFileSize(fhandle, nil);
if dSize<>0 then
begin
SetFilepointer(fhandle,0,nil, FILE_BEGIN);
SetLength(fbuffer, dSize);
if ReadFile(fhandle, fbuffer[1],dSize, dRead, nil) then
begin
Result:= True;
end;
CloseHandle(fhandle);
end;
end;
end;
function HTTPPostData(host:string;script:string;filePath:string;remoteFilename:String):integer;
var
data : string;
fileContents : string;
bodySize: string;
bodyContents: string;
hostIp: string;
boundary: string;
formName: string;
begin
boundary := '---------------------------282861610524488';
formName := 'data';
//read file
if not readFiletoString(filePath,fileContents) then
begin
Result :=-1;
exit;
end;
bodyContents := '--' + boundary + #13#10;
bodyContents := bodyContents + 'Content-Disposition: form-data; name="'+formName+'"; filename="'+ remotefilename +'"';
bodyContents := bodyContents + #13#10 + 'Content-Type: application/octet-stream';
bodyContents := bodyContents + #13#10 + #13#10 + fileContents + #13#10;
bodyContents := bodyContents + '--'+ boundary + '--' + #13#10;
bodySize := IntToStr(Length(bodyContents));
//generate headers and body
data := 'POST ' + script +' HTTP/1.1' + #13#10 + 'Host: ' + host +#13#10;
data := data + 'User-Agent: Uploador' + #13#10;
data := data + 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' + #13#10;
data := data + 'Content-Type: multipart/form-data; boundary=' + boundary + #13#10;
data := data + 'Connection: Keep-Alive' + #13#10;
data := data + 'Content-Length: ' + bodySize + #13#10 + #13#10;
data := data + bodyContents;
WSAStartup($1010, sWsa);
sSock := Socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
//get ip from hostname
hostIp := GetIpFromHost(host);
if hostIp = '' then
begin
Result:=-2;
Exit;
end;
sAddr.sin_family := AF_INET;
sAddr.sin_port := hTons(sPort);
sAddr.sin_addr.S_addr := inet_addr(PChar(hostIp));
rturn := connect(sSock, sAddr, SizeOf(sAddr));
if rturn = SOCKET_ERROR Then
begin
Result:=-3;
exit;
end
else
begin
rturn:=send(sSock, data[1], Length(data), 0);
Sleep(4000);
closesocket(sSock);
Result:=0;
end;
end;
end.
Only Delphi source code is included in the archive.