Delphi + PHP

Delphi 2007 の Indy コンポーネントを使い、ファイルを HTTP 経由でアップロードし、PHP5 でダウンロードする動作を確認しました。下記のサンプルをそのまま実行しようとしたら、PHP5 で動かなかったことと、Delphi 側も多少の手直しが必要でした。

<?php
$upload_dir = '/data/www/html/uploader/data';
$maxfilesize = 1024000; // up to 1MB
$send = $_POST['send'];
$userfile = $_FILES['userfile'];
$phpself = $_SERVER['PHP_SELF'];
if(isset($send)) {
if(is_uploaded_file($userfile['tmp_name'])) {
if($userfile['size'] <= $maxfilesize) {
if (move_uploaded_file($userfile['tmp_name'],
$upload_dir.'/'.$userfile['name'])) {
echo '<p>upload ok</p>';
} else {
echo '<p>upload error</p>';
}
}
}
}
?>
<form action="<?php echo $phpself; ?>" method="post" enctype="multipart/form-data">
<input type="hidden" name="MAX_FILE_SIZE" value="<?php echo $maxfilesize; ?>">
<input type="file" name="userfile">
<input type="submit" name="send" value="send">
</form>

Delphi の Form1 には IdHTTP1, Button1, Memo1 を貼り付けました。

implementation
{$R *.dfm}
uses IdMultipartFormData;
procedure TForm1.Button1Click(Sender: TObject);
var
ResponseStream: TMemoryStream;
MultiPartFormDataStream: TidMultiPartFormDataStream;
begin
MultiPartFormDataStream := TidMultiPartFormDataStream.Create;
ResponseStream := TMemoryStream.Create;
try
IdHttp1.Request.ContentType :=
MultiPartFormDataStream.RequestContentType;
MultiPartFormDataStream.AddFile(
'userfile', 'c:\test.jpg', 'multipart/form-data');
MultiPartFormDataStream.AddFormField('send', 'send');
MultiPartFormDataStream.Position := 0;
IdHTTP1.Post('http://server/uploader/’,
MultiPartFormDataStream, ResponseStream);
Memo1.Lines.Append('[upload ok]');
finally
MultiPartFormDataStream.Free;
ResponseStream.Free;
end;
end;
procedure TForm1.IdHTTP1Status(ASender: TObject; const AStatus: TIdStatus;
const AStatusText: string);
begin
Memo1.Lines.Append(AStatusText);
end;