パーミッションが違う
ファイルのアップロード処理をする際、アップロードされたファイルを適切な場所に移動させる必要がある場合がある。このとき、一番いいのはmove_uploaded_file関数を使って、ファイルを移動するのがいい。というのは移動元のファイルがアップロードされたファイルなのかどうかをチェックしてくれるからだ。これにより、あらぬセキュリティ問題を考えなくてすむからだ(もちろん他にも問題は山積するのだが)。
ファイルのチェックという意味では、似た機能としてis_uploaded_file()という関数がある。これはHTTP POSTでアップロードしたファイルかどうかをチェックしてくれる関数だ(でもこれは本題ではない)。
ファイルの移動なら、copy関数もあるし、ファイルポインタをopenして(fopen)して、新しいファイル(移動先)に内容を書き込んだりすることでも実現できる。これらの方法はmove_uploaded_file()関数と圧倒的な違いがある(前述のセキュリティの問題を除いて)。それは移動されたファイルのパーミッションだ。CentOS5のデフォルトな環境だと、移動先のファイルは以下のようになる。
move_uploaded_file()で移動した場合・・・600
その他の方法で移動した場合・・・644
なんで違うんだろ。umask()の設定が影響しているんだろうか。前者の場合はapacheの読み書き権限しかないので、FTPでダウンロードとかできないわけで、ちょっと不便だったりする。手間だけど、is_uploaded_file()でチェックしつつ、copy()等で移動するほうが使いやすい(もしくはchmod()か)。やりようはいろいろあるんだけど、一番スマートな方法を極めるためには少し調べる必要がありそうだ。