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;