Upload File Melalui HTTP Menggunakan Delphi dan TWebBrowser

Halo temen2 smua….
Kembali lagi pada tutorial singkat…

Kali ini aku akan bahas sedikit mengenai HTTP POST menggunakan Delphi dan TWebBrowser. Dalam kasus ini yang kita butuhkan adalah:
- komputer server
- komputer client

Pada komputer server dibutuhkan adanya web server yang telah terinstall, semisal apache atau tomcat. Setelah itu pada client kita gunakan component yang sudah ada pada delphi, yaitu: TWebBrowser.

Semisal kita menginginkan suatu aplikasi Delphi yang dapat meng-upload suatu file, misal: file gambar, dari client ke server. Kita siapkan dulu web server beserta web yang telah jadi yang memungkinkan kita untuk bisa upload file dari client ke server. Setelah itu buka Delphi dan pasang WebBrowser1 (TWebBrowser) pada form. Pada listing program, buat procedure UploadFilesHttpPost seperti berikut ini.

——————————————————————————————————–

procedure UploadFilesHttpPost(const wb:TWebBrowser; const URLstring: string; names, values, nFiles, vFiles: array of string) ;
var
strData, n, v, boundary: string;
URL: OleVariant;
Flags: OleVariant;
PostData: OleVariant;
Headers: OleVariant;
idx: Integer;

ms: TMemoryStream;
ss: TStringStream;
begin
if Length(names) Length(values) then
raise Exception.Create('UploadFilesHttpPost: Names and Values must have the same length.') ;
if Length(nFiles) Length(vFiles) then
raise Exception.Create('UploadFilesHttpPost: FileNames and FileValues must have the same length.') ;

URL := 'about:blank';
Flags := NavNoHistory or NavNoReadFromCache or NavNoWriteToCache or NavAllowAutosearch;
wb.Navigate2(URL, Flags) ;
while wb.ReadyState < READYSTATE_INTERACTIVE do Application.ProcessMessages;

// anything random that WILL NOT occur in the data.
boundary := '---------------------------123456789';

strData := '';
for idx := Low(names) to High(names) do
begin
n := names[idx];
v := values[idx];

strData := strData + '--' + boundary + #13#10 + 'Content-Disposition: form-data; name="' + n + '"' + #13#10#13#10 + v + #13#10;
end;

for idx := Low(nFiles) to High(nFiles) do
begin
n := nFiles[idx];
v := vFiles[idx];

strData := strData + '--' + boundary + #13#10 + 'Content-Disposition: form-data; name="' + n + '"; filename="' + v + '"' + #13#10;

if v = '' then
begin
strData := strData + 'Content-Transfer-Encoding: binary''#13#10#13#10;
end
else
begin
if (CompareText(ExtractFileExt(v), '.JPG') = 0) or (CompareText(ExtractFileExt(v), '.JPEG') = 0) then
begin
strData := strData + 'Content-Type: image/pjpeg'#13#10#13#10;
end
else if (CompareText(ExtractFileExt(v), '.PNG') = 0) then
begin
strData := strData + 'Content-Type: image/x-png'#13#10#13#10;
end
else if (CompareText(ExtractFileExt(v), '.PDF') = 0) then
begin
strData := strData + 'Content-Type: application/pdf'#13#10#13#10;
end
else if (CompareText(ExtractFileExt(v), '.HTML') = 0) then
begin
end;

strData := strData + 'Content-Type: text/html'#13#10#13#10;

ms := TMemoryStream.Create;
try
ms.LoadFromFile(v) ;
ss := TStringStream.Create('') ;
try
ss.CopyFrom(ms, ms.Size) ;

strData := strData + ss.DataString + #13#10;
finally
ss.Free;
end;
finally
ms.Free;
end;
end;

strData := strData + '--' + boundary + '--'#13#10; // FOOTER
end;

strData := strData + #0;

{2. you must convert a string into variant array of bytes and every character from string is a value in array}
PostData := VarArrayCreate([0, Length(strData) - 1], varByte) ;

{ copy the ordinal value of the character into the PostData array}
for idx := 1 to Length(strData) do PostData[idx-1] := Ord(strData[idx]) ;

{3. prepare headers which will be sent to remote web-server}
Headers := 'Content-Type: multipart/form-data; boundary=' + boundary + #13#10;

{4. you must navigate to the URL with your script and send as parameters your array with POST-data and headers}
URL := URLstring;
wb.Navigate2(URL, Flags, EmptyParam, PostData, Headers) ;
while wb.ReadyState < READYSTATE_INTERACTIVE do Application.ProcessMessages;
end;

--------------------------------------------------------------------------------------------------------

Kemudian siapkan dua tombol (Button1 dan Button2) yang digunakan untuk membuka (browse) file dari komputer client, dan satunya lagi digunakan untuk menyimpan. Pada Button1 buatlah listing program agar bisa dibrowse ke OpenDialog1. Dan pada Button2, tulis listing program untuk menjalankan prosedur di atas dengan menuliskan
--------------------------------------------------------------------------------------------------------
UploadFilesHttpPost(WebBrowser1, 'http://validator.w3.org/check',[],[],['uploaded_file'],['nama_file']);
--------------------------------------------------------------------------------------------------------
http://validator.w3.org/check merupakan contoh url dari web server untuk upload file. Apabila Button2 tersebut diklik, maka file akan di upload ke web server.

Silakan mencoba...

Sumber: http://delphi.about.com/

Leave a Reply