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;