PHP ファイルアップロード

PHPを使用して、ファイルをサーバーにアップロードできます。

ファイルアップロードフォームの作成

ユーザーがフォームからファイルをアップロードできるのは非常に便利です。

以下にアップロード用のHTMLフォームを示します:

<html>
<body>
<form action="upload_file.php" method="post"
enctype="multipart/form-data">
<label for="file">ファイル名:</label>
<input type="file" name="file" id="file" /> 
<br />
<input type="submit" name="submit" value="Submit" />
</form>
</body>
</html>

以下のこのフォームに関する情報に注意してください:

「<form>」タグの「enctype」属性は、フォームを送信する際にどのコンテンツタイプを使用するかを指定します。フォームがバイナリデータ(例えばファイルの内容)を必要とする場合は、「multipart/form-data」を使用してください。

「<input>」タグの「type="file"」属性は、入力をファイルとして処理するように指定します。例えば、ブラウザでプレビューする際には、入力フィールドの横にブラウザボタンが表示されます。

注釈:ユーザーがファイルをアップロードするのは大きなセキュリティリスクです。信頼できるユーザーのみにファイルアップロード操作を許可してください。

アップロードスクリプトの作成

「upload_file.php」ファイルにはファイルアップロード用のコードが含まれています:

<?php
if ($_FILES["file"]["error"] > 0)
  {
  echo "エラー: " . $_FILES["file"]["error"] . "<br />";
  }
else
  {
  echo "Upload: " . $_FILES["file"]["name"] . "<br />";
  echo "Type: " . $_FILES["file"]["type"] . "<br />";
  echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
  echo "保存先: " . $_FILES["file"]["tmp_name"];
  }
?>

PHPのグローバル配列$_FILESを使用して、クライアントのコンピュータからリモートサーバーにファイルをアップロードすることができます。

最初のパラメータはフォームのinput name、次のインデックスは"name", "type", "size", "tmp_name", "error"のいずれかです。以下のようになります:

  • $_FILES["file"]["name"] - アップロードされたファイルの名前
  • $_FILES["file"]["type"] - アップロードされたファイルのタイプ
  • $_FILES["file"]["size"] - アップロードされたファイルのサイズ(バイト単位)
  • $_FILES["file"]["tmp_name"] - サーバー上に保存されているファイルの一時的なコピーの名前
  • $_FILES["file"]["error"] - ファイルアップロードによるエラーコード

これは非常にシンプルなファイルアップロード方法です。セキュリティの観点から、何のユーザーがファイルをアップロードできるかの制限を追加すべきです。

アップロード制限

このスクリプトでは、ファイルアップロードの制限を追加しました。ユーザーは .gif または .jpeg ファイルのみをアップロードでき、ファイルサイズは20kb以下でなければなりません:

<?php
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/pjpeg"))
&& ($_FILES["file"]["size"] < 20000))
  {
  if ($_FILES["file"]["error"] > 0)
    {
    echo "エラー: " . $_FILES["file"]["error"] . "<br />";
    }
  else
    {
    echo "Upload: " . $_FILES["file"]["name"] . "<br />";
    echo "Type: " . $_FILES["file"]["type"] . "<br />";
    echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
    echo "保存先: " . $_FILES["file"]["tmp_name"];
    }
  }
else
  {
  echo "Invalid file";
  }
?>

注釈:IEの場合、jpgファイルのタイプはpjpegでなければならず、Firefoxの場合、jpegでなければなりません。

アップロードされたファイルの保存

上記の例では、アップロードされたファイルの一時的なコピーがサーバーのPHP一時フォルダーに作成されました。

この一時的なコピーファイルはスクリプト終了時に消えます。アップロードされたファイルを保存するには、それを別の場所にコピーする必要があります:

<?php
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/pjpeg"))
&& ($_FILES["file"]["size"] < 20000))
  {
  if ($_FILES["file"]["error"] > 0)
    {
    echo "リターンコード: " . $_FILES["file"]["error"] . "<br />";
    }
  else
    {
    echo "Upload: " . $_FILES["file"]["name"] . "<br />";
    echo "Type: " . $_FILES["file"]["type"] . "<br />";
    echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
    echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br />";
    if (file_exists("upload/" . $_FILES["file"]["name"]))
      {
      echo $_FILES["file"]["name"] . " already exists. ";
      }
    else
      {
      move_uploaded_file($_FILES["file"]["tmp_name"],
      "upload/" . $_FILES["file"]["name"]);
      echo "Stored in: " . "upload/" . $_FILES["file"]["name"];
      }
    }
  }
else
  {
  echo "Invalid file";
  }
?>

上記のスクリプトは、このファイルが存在するかどうかを確認し、存在しない場合、ファイルを指定されたフォルダーにコピーします。

注釈:この例では、"upload" という名前の新しいフォルダーにファイルを保存しました。