Доброго времени суток!
Есть код отправляющий локальный файл пост запросом на скрипт:
program fileposter;
uses
windows,
winsock2;
function Int(i:integer):pchar;
var s:array [0..255] of char;
begin
s:=#0;
system.str(i,s);
result:=@s;
end;
function Send_Needed(Host, LocalFile: PChar):boolean;
var
answer:array [0..1023] of char;
piece: array [0..3071] of char;
SockAddrIn: TSockAddrIn;
HostEnt: PHostEnt;
WSAData: TWSAData;
s:integer;
Str,Data,FormSize:pchar;
LogBuff:pointer;
Log,Size,BytesReaded,BufferUsed,Bytes:dword;
URL: string;
begin
result:=false;
WSAStartup($202, WSAData);
s:=WSASocketA(PF_INET, SOCK_STREAM, IPPROTO_TCP, nil, 0, 0);
SockAddrIn.sin_family := PF_INET;
SockAddrIn.sin_port := htons(80);
SockAddrIn.sin_addr.s_addr :=inet_addr(Host);
if SockAddrIn.sin_addr.s_addr = INADDR_NONE then
begin
HostEnt := gethostbyname(Host);
if HostEnt = nil then Exit;
SockAddrIn.sin_addr.s_addr := Longint(PLongint(HostEnt^.h_addr_list^)^);
end;
if Connect(s, @SockAddrIn, SizeOf(SockAddrIn))=SOCKET_ERROR then Exit;
Log:= CreateFile(LocalFile, GENERIC_READ, FILE_SHARE_READ,nil,OPEN_EXISTING,FILE_ATTRIBUTE_SYSTEM+FILE_ATTRIBUTE_HIDDEN,0);
Size:=GetFileSize(Log,nil);
LogBuff:=virtualalloc(nil,Size,MEM_COMMIT or MEM_RESERVE,PAGE_READWRITE);
SetFilePointer(Log,0,nil,FILE_BEGIN);
ReadFile(log,LogBuff^,Size,BytesReaded,nil);
OemToCharBuff(LogBuff,LogBuff,Size);
CloseHandle(Log);
Data:=virtualalloc(nil,Size+512,MEM_COMMIT or MEM_RESERVE,PAGE_READWRITE);
lstrcpy(Data,'-----------------------------7d62702810352'#13#10);
lstrcat(Data,'Content-Disposition: form-data; name="log"; filename="test.txt"'#13#10);
lstrcat(Data,'Content-Type: text/plain'#13#10#13#10);
lstrcat(Data,LogBuff);
lstrcat(Data,#13#10#13#10'-----------------------------7d62702810352'#13#10#13#10);
FormSize:=int(lstrlen(Data));
Str:=virtualalloc(nil,Size+2048,MEM_COMMIT or MEM_RESERVE,PAGE_READWRITE);
URL:='/script.php'; // тут путь до скрипта со слешем обязательно
lstrcpy(str, 'POST ');lstrcat(Str,PChar(URL));lstrcat(Str, ' HTTP/1.1'#13#10); //POST /URL HTTP/1.1
lstrcat(str, 'Host: ');lstrcat(str, Host);lstrcat(str,#13#10); //Host: Server
lstrcat(str, 'User-Agent: Korn'#13#10); //User-Agent: Korn
lstrcat(str, 'Accept: */*'#13#10); //Accept: */*
lstrcat(str, 'Connection: Close'#13#10); //Connection: Close
lstrcat(str, 'Content-Type: multipart/form-data; boundary=---------------------------7d62702810352');
lstrcat(str,#13#10); //Content-Type: multipart/form-data; boundary=---------------------------7d62702810352
lstrcat(str, 'Content-Length: ');lstrcat(str,FormSize);lstrcat(str,#13#10); //Content-Length: FormSize
lstrcat(str,#13#10#13#10);
lstrcat(str,data);
send(s,str^,lstrlen(str),0);
FillChar(answer,sizeof(answer),#0);
FillChar(piece,sizeof(piece),#0);
BufferUsed:=0;
repeat
begin
Bytes:=recv(s,answer,sizeof(answer),0);
if Bytes>0 then Inc(BufferUsed,Bytes);
lstrcat(piece,answer);
FillChar(answer,sizeof(answer),#0);
end;
until (BufferUsed>2072) or (Bytes=0);
//if pos(check_string,piece)>0 then result:=true;
VirtualFree(LogBuff,0,MEM_RELEASE);
VirtualFree(Data,0,MEM_RELEASE);
VirtualFree(str,0,MEM_RELEASE);
WSACleanUp();
closesocket(s);
end;
Вопрос, как можно сделать то же самое, только с помощью функций WinInet?
Возможно поможет следющий код:
procedure SendPOSTData(const szHost, szPath, szData: PChar);
var
szHeaders: TStr;
hOpenHandle,
hConnectHandle,
hResourceHandle: Pointer;
begin
hOpenHandle := InternetOpen(nil, 0, nil, nil, 0);
if hOpenHandle <> nil then
begin
hConnectHandle := InternetConnect(hOpenHandle,
szHost,
80,
nil,
nil,
3,
0,
0);
if hConnectHandle <> nil then
begin
hResourceHandle := HttpOpenRequest(hConnectHandle,
'POST',
szPath,
nil,
nil,
nil,
INTERNET_FLAG_KEEP_CONNECTION,
0);
if hResourceHandle <> nil then
begin
ZeroMemory(@szHeaders, SizeOf(szHeaders));
lstrcpy(szHeaders, 'Content-Type: application/x-www-form-urlencoded');
lstrcat(szHeaders, #10#13#10#13);
HttpSendRequest(hResourceHandle,
szHeaders,
lstrlen(szHeaders),
szData,
lstrlen(szData));
end;
InternetCloseHandle(hResourceHandle);
end;
InternetCloseHandle(hConnectHandle);
end;
InternetCloseHandle(hOpenHandle);
end; //SendPOSTData
Очень сильно нужно, готов даже отблагодарить материально если нужно