【PHP】move_uploaded_fileが動かないとき、アップロードファイルか確認しよう

Web開発
この記事は約2分で読めます。

こんにちは、@Manabu です。

今回は、PHPのmove_uploaded_file関数が思うように動かなかった話をしたいと思います。

確認方法と解決策も併せて紹介しますので、ぜひ参考にしてください。

move_uploaded_file関数とは?

move_uploaded_file関数は、アップロードされたファイルを新しい位置に移動するための関数です。

以下のような形で使用されます。

move_uploaded_file( $from , $to )

$fromには、アップロードしたファイルの名前、$toにはファイルの移動先のディレクトリを指定します。

発生した問題

今回、私が直面した問題は、以下のような使い方の場面です。

if ( move_uploaded_file( $from , $to  ) ) {
  // trueの場合の処理
}

このように、if文の条件として使用しており、正しく移動できた場合にはif文の中の処理が実行されるようになっています。

ただ、ファイルの移動も行われないし、if文の中の処理も実行されない状況でした。

問題の原因

今回の問題の原因としては、すでにPHPのcopy関数を使用して別のディレクトリにコピーしたファイルを、fromの値として設定してしまっていたところにあります。

move_uploaded_file関数には、PHP の HTTP POST アップロード機構によりアップロードされたという意味で有効なアップロードファイルであるかどうかを確認するという仕組みがあり、この条件をクリアしていませんでした。

そのため、if文の条件としての移動処理は実行されず、結果もfalseを返すためif文の中の処理が実行されていないということでした。

解決策

PHP の HTTP POST アップロード機構によりアップロードされたファイルでなく、サーバーに保存されたファイルを移動したい場合は、copy関数かrename関数を使うようにしましょう

私は、以下のように修正することで解決しました。

if ( copy( $from , $to ) ) {
  // trueの場合の処理
}

こうすることで、すでに保存されているファイルが移動(コピー)され、if文の中の処理も実行されるようになります。

まとめ

move_uploaded_file関数は強力なツールですが、使用する際には一時ファイルの扱いに注意が必要です。

特にページ間でファイルを処理する場合、ファイルが一時ディレクトリに存在している間に処理を行うか、セッションや一時保存を活用することで、問題を回避することができます。