move_uploaded_file

関数の概要

move_uploaded_file は、PHPでファイルをアップロードした際に、一時的に保存されたファイルを指定の場所に移動させるための関数です。主にWebフォームから送信されたアップロードファイルをサーバー上の安全なディレクトリに保存する際に使われます。この関数はアップロードされたファイルかどうかを内部でチェックして移動を行うため、セキュリティ面でも重要です。

パラメータの説明

  • string $filename : 一時保存されたアップロードファイルのパス(通常は $_FILES['input_name']['tmp_name'] で取得)
  • string $destination : ファイルを移動させたい最終の保存先(フルパスで指定)

戻り値

処理が成功すると true を返し、失敗すると false を返します。失敗する理由としては、ファイルの存在がない、パーミッションの問題、移動先ディレクトリが存在しない場合などが考えられます。

使用例

基本的な使い方

<?php
if (isset($_FILES['userfile'])) {
    $tmpName = $_FILES['userfile']['tmp_name'];
    $uploadDir = '/var/www/html/uploads/';
    $uploadFile = $uploadDir . basename($_FILES['userfile']['name']);

    if (move_uploaded_file($tmpName, $uploadFile)) {
        echo 'ファイルは正常にアップロードされました。';
    } else {
        echo 'ファイルのアップロードに失敗しました。';
    }
}
?>

フォームからアップロードされたファイルを指定のディレクトリに移動させる典型的な例です。basenameを使ってファイル名を取得し、不正なパスを防いでいます。

ファイル名を変更して保存する例

<?php
if (isset($_FILES['photo'])) {
    $tmpName = $_FILES['photo']['tmp_name'];
    $uploadDir = 'uploads/';
    $newName = 'profile_' . time() . '.' . pathinfo($_FILES['photo']['name'], PATHINFO_EXTENSION);
    $uploadFile = $uploadDir . $newName;

    if (move_uploaded_file($tmpName, $uploadFile)) {
        echo 'ファイルは ' . htmlspecialchars($newName) . ' として保存されました。';
    } else {
        echo 'アップロードに失敗しました。';
    }
}
?>

アップロード時にファイル名をタイムスタンプ付きで変更して保存しています。これによりファイル名の重複を避けることができます。

アップロードファイルのサイズやタイプをチェックしてから移動する例

<?php
if (isset($_FILES['document'])) {
    $tmpName = $_FILES['document']['tmp_name'];
    $uploadDir = 'docs/';
    $filename = basename($_FILES['document']['name']);
    $uploadFile = $uploadDir . $filename;

    $fileType = mime_content_type($tmpName);
    $fileSize = $_FILES['document']['size'];

    if ($fileSize > 5 * 1024 * 1024) { // 5MB制限
        echo 'ファイルサイズが大きすぎます。';
        exit;
    }

    $allowedTypes = ['application/pdf', 'image/jpeg', 'image/png'];
    if (!in_array($fileType, $allowedTypes)) {
        echo '許可されていないファイル形式です。';
        exit;
    }

    if (move_uploaded_file($tmpName, $uploadFile)) {
        echo 'ファイルがアップロードされました。';
    } else {
        echo 'アップロードに失敗しました。';
    }
}
?>

ファイルサイズとMIMEタイプをチェックすることで、不正なファイルのアップロードを防止しています。これらのチェックはセキュリティ面で非常に重要です。

関連する関数

  • is_uploaded_file() : 指定したファイルがアップロードされたものであるかを判定する関数
  • basename() : ファイル名を取得し、ディレクトリトラバーサル攻撃を防ぐ
  • mime_content_type() : ファイルのMIMEタイプを取得する
  • $_FILES : アップロードされたファイル情報が格納されるスーパーグローバル変数

まとめ

move_uploaded_fileはPHPで安全にアップロードファイルを適切な場所に移動保存するための重要な関数です。必ずアップロードされたファイルかどうかを内部でチェックし、失敗時にはfalseを返すため、エラーハンドリングも必須です。実務ではファイル名の加工やファイルサイズやMIMEタイプの検証と組み合わせて使うことが多いので、本記事の使用例を参考に適切に活用してください。