HTTPでファイルのアップロード #2

 
DelphiとPHP 

昨日の記事で思ったよりも検索で飛んでくる方がいました。

このような事をやりたい人は沢山いるんですね。それではということで具体的なコードを書いておきます。

用意するのはサーバー側へ PHPと /dataフォルダ。Delphiではボタン1個とオープンダイアログ1個です。
そして、Indyコンポーネントが必要で、usesするのは以下の pasファイル。
IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdHTTP, IdMultipartFormData;

具体的なコードは以下のとおり。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
Delphi
 
procedure TForm1.Button1Click(Sender: TObject);
const
  UpURL = 'http://xxxxxx.com/test/upfile.php';
var
  ResStream: TMemoryStream;
  MpfDataStream: TIdMultiPartFormDataStream;
  IdHTTP : TIdHTTP;
begin
  if OpenDialog1.Execute then
  begin
    MpfDataStream := TidMultiPartFormDataStream.Create;
    ResStream := TMemoryStream.Create;
    IdHTTP := TIdHTTP.Create;
    try
      IdHttp.Request.ContentType := MpfDataStream.RequestContentType;
      MpfDataStream.AddFile('userfile', OpenDialog1.FileName, 'multipart/form-data');
      MpfDataStream.AddFormField('send', 'send');
      MpfDataStream.Position := 0;
      IdHTTP.Post(UpURL, MpfDataStream, ResStream);
    finally
      IdHTTP.Free;
      MpfDataStream.Free;
      ResStream.Free;
    end;
  end;
end;
 
 
サーバーに設置する PHP (upfile.php)
 
<?php
    $upload_dir = './data';
    $maxfilesize = 102400000; // up to 100MB
    $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>

どうぞ試してみてください。