PHPによるファイルのアップロード

 今度はWebフォームの「INPUT TYPE=FILE」 タグによるファイルのアップロードリクエストを、 PHPで受け取るサンプルを作ってみます。 受け取った後、通常はサーバ機のどこかにその内容を保存して、 後続のバッチ処理などでサルベージするのが考えられる処理の形態ですが、 ここではアップロードされたファイルの内容を単に 「受け取ったぞ」とばかりに画面に表示する処理を行っています。

<html><body bgcolor="white">
<?php
if(empty($_FILES["datafilename"]["tmp_name"])){
?>
  <h1>ファイルのアップロードのテスト</h1>
  <form action="<?= $_SERVER[REQUEST_URI] ?>"
   enctype="multipart/form-data" method="POST">
  ファイルを指定して下さい:<br>
  <input type="file" name="datafilename"><br>
  <input type="submit" value="送信">
  </form>
<?php
}
else{
  $tmpfilename = $_FILES["datafilename"]["tmp_name"];
  if(is_uploaded_file($tmpfilename)){
    print "アップロードされたファイルです。<br>";
    $size = $_FILES["datafilename"]["size"];
    $fin = fopen($tmpfilename, "r");
    $data = fread($fin, $size);
    $data = htmlspecialchars($data);
    fclose($fin);
    $name  = $_FILES["datafilename"]["name"];
    $type  = $_FILES["datafilename"]["type"];
    $error = $_FILES["datafilename"]["error"];
?>
    <h1>アップロードされたファイルの内容:</h1>
    クライアントPC上のファイル名:<?= $name ?><br>
    ファイルタイプ(mime):<?= $type ?><br>
    エラーコード:<?= $error ?><br>

    <font color="#600000"><pre><?= $data ?></pre></font><br>
    <a href="<?= $_SERVER[REQUEST_URI] ?>">戻る</a><br>
<?php
  }
}
?>
</body></html>

 「INPUT TYPE=FILE」タグの使い方は上のサンプルの通りです。 で、PHP4からは、これをPHPで受け取るときの方法が以前と変わりました。 アップロードされたファイルは、 まずサーバ機上の /tmp などの位置に一時ファイルとして保存された状態で、 PHPによる応答処理が開始されます。このとき作られた一時ファイル名は、

$_FILES["datafilename"]["tmp_name"]

で参照できます。ここで「datafilename」 の部分は「INPUT TYPE=FILE」タグでNAME=属性に指定した値に適当に置き換えてください。 「tmp_name」は固定です。 同様に、

$_FILES["datafilename"]["size"]

はこの一時ファイルのバイト数が、

$_FILES["datafilename"]["name"]

はアップロードされたファイルの 「クライアント機上でのファイル名」が格納されています。 一時ファイルのバイト数が極端に大きかったり小さかったりしたら処理の対象外にする、 などの安全策が充分考えられますね。 また、

$_FILES["datafilename"]["error"]

はPHP 4.2.2から追加された変数で、アップロードが正常に行われた場合には0、 そうでなければそれを示すエラーコードが格納されています。

 それで、安全上の理由から、 一時ファイル名が確かにブラウザからアップロードされた一時ファイルのものであるかどうかを確認するために、 組み込み関数 is_uploaded_file が用意されているので、これが真を返した場合のみ処理を行うようにとのことで、 ここではこれに従ってみました。

Open Source Web Architecture Top

(first uploaded 2002/01/02 last updated 2003/01/24, URANO398 - KQ TAURA)

楽天モバイル[UNLIMITが今なら1円] ECナビでポインと Yahoo 楽天 LINEがデータ消費ゼロで月額500円〜!


無料ホームページ 無料のクレジットカード 海外格安航空券 解約手数料0円【あしたでんき】 海外旅行保険が無料! 海外ホテル