こんにちは、@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関数は強力なツールですが、使用する際には一時ファイルの扱いに注意が必要です。
特にページ間でファイルを処理する場合、ファイルが一時ディレクトリに存在している間に処理を行うか、セッションや一時保存を活用することで、問題を回避することができます。