A jak się upierasz na ten WebBrowser to:
W WebBrowser nie ma możliwości wypełnienia pola typu file (podobno ze względów bezpieczeństwa)
Aby wywołać okno ładowania pliku w WebBrowser to poszukać (albo jakieś getElementByID albo pętelka i sprawdzanie to zależy od HTML czy jest ID czy może tylko name itp.) odpowiedniego elementu (tego input typu file) i wywołać metodę Click (pod warunkiem że jest widoczne inaczej chyba nie zadziała)
Wysłać plik za pomocą WebBrowser oczywiście można napisałem przykład (sprawdzony w Delphi 7) ale nie chciało mi się pisać komentarzy jak coś nie będzie jasne to pisz:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, OleCtrls, SHDocVw;
type
TForm1 = class(TForm)
WebBrowser1: TWebBrowser;
btnSend: TButton;
OpenDialog1: TOpenDialog;
procedure btnSendClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
procedure WaitWhileBusy(WB: TWebBrowser);
function StreamToVarArray(AStream: TStream): OleVariant;
procedure WBPostMultipartData(WB: TWebBrowser; const URL, FieldName,
FileName: string; const Data: TStream; const FormFields: TStrings);
function GetActionURL(WB: TWebBrowser; FormName: string): string;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses MSHTML;
{$R *.dfm}
procedure TForm1.WaitWhileBusy(WB: TWebBrowser);
begin
while WB.ReadyState <> READYSTATE_COMPLETE do
Application.ProcessMessages;
end;
function TForm1.StreamToVarArray(AStream: TStream): OleVariant;
var
Buffer: Pointer;
begin
AStream.Position:= 0;
Result:= VarArrayCreate([0, AStream.Size - 1], VarByte);
Buffer:= VarArrayLock(Result);
AStream.ReadBuffer(Buffer^, AStream.Size);
VarArrayUnlock(Result);
end;
procedure TForm1.WBPostMultipartData(WB: TWebBrowser; const URL, FieldName,
FileName: string; const Data: TStream; const FormFields: TStrings);
const
CRLF = #13#10;
FIELD_MASK = CRLF + '--%s' + CRLF +
'Content-Disposition: form-data; name="%s"' + CRLF + CRLF + '%s';
var
Flags, SendData, Headers: OleVariant;
Bound, s, PostData: string;
ms: TMemoryStream;
i: Integer;
begin
Bound:= '===============' + IntToHex(Random(MaxInt), 8) + '==';
s:= '--' + Bound + CRLF;
s:= s + 'content-disposition: form-data; name="' + FieldName + '";';
s:= s + ' filename="' + FileName +'"' + CRLF;
s:= s + 'Content-Type: Application/octet-string' + CRLF + CRLF;
ms:= TMemoryStream.Create;
try
ms.Write(Pointer(s)^, Length(s));
ms.CopyFrom(Data, Data.Size);
for i:= 0 to FormFields.Count - 1 do
begin
s:= Format(FIELD_MASK,[Bound, FormFields.Names[I],
FormFields.Values[FormFields.Names[I]]]);
ms.Write(Pointer(s)^, Length(s));
end;
s:= CRLF + '--' + Bound + '--' + CRLF;
ms.Write(Pointer(s)^, Length(s));
//stare kopiowanie
{SetString(PostData, PChar(ms.Memory), ms.Size div SizeOf(Char));
SendData:= VarArrayCreate([0, length(PostData)-1], varByte);
for i := 1 to length(PostData) do
SendData[i-1] := ord(PostData[i]);}
SendData:= StreamToVarArray(ms);
finally
ms.Free;
end;
Headers:= 'Content-Type: multipart/form-data; boundary=' + Bound + CRLF;
Flags:= NavNoHistory or NavNoReadFromCache or NavNoWriteToCache
or NavAllowAutosearch;
WB.Navigate(URL, Flags, EmptyParam, SendData, Headers);
WaitWhileBusy(WB);
VarClear(SendData);
end;
function TForm1.GetActionURL(WB: TWebBrowser; FormName: string): string;
var
i: Integer;
doc: IHTMLDocument2;
form: IHTMLFormElement;
begin
result:='';
doc:= WB.Document as IHTMLDocument2;
if Assigned(doc) then
begin
for i:= 0 to doc.forms.length - 1 do
begin
form:= doc.forms.item(i, EmptyParam) as IHTMLFormElement;
if form.name = FormName then
begin
result:= form.action;
break;
end;
end;
end;
end;
procedure TForm1.btnSendClick(Sender: TObject);
var
FileName: string;
URL: string;
DataStream: TFileStream;
FormFields: TStringList;
begin
WebBrowser1.Navigate('http://encodable.com/uploaddemo/');
WaitWhileBusy(WebBrowser1);
if OpenDialog1.Execute then
begin
DataStream:= TFileStream.Create(OpenDialog1.FileName, fmOpenRead);
try
FormFields:= TStringList.Create;
try
FormFields.Delimiter:= '&';
FormFields.DelimitedText:= 'numitems=1&numfileelements=2&subdir1=/&newsubdir1=';
FileName:= ExtractFileName(OpenDialog1.FileName);
URL:= 'http://encodable.com' + GetActionURL(WebBrowser1, 'theuploadform');
WBPostMultipartData(WebBrowser1, URL, 'uploadname1', FileName, DataStream,
FormFields);
WaitWhileBusy(WebBrowser1);
finally
FormFields.Free;
end;
finally
DataStream.Free;
end;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Randomize;
end;
end.
No ale jednak tak jak @olesio twierdzę że porywania się z tym WebBrowser (o ile to nie jest konieczne) do uploadu pliku to jak polowania na muchy z armatą. Od kiedy zadałeś pytanie na pewno znalazłbyś czas aby poczytać trochę i poznać podstawy Synapse czy Indy bo naprawdę wysłać plik za pomocą tych pakietów to nic skomplikowanego.