PHPでファイルをアップロードする関数!
PHPでどんなファイルも全てアップロードできる関数は以下のように実現できます。
/*************************************************** * ファイルを拡張子を変えずにアップロードする * 引数: * 1.<input type="file"/>でアップロードしたデータ * 2.アップロード後のファイルにつける名前 * 3.アップロード先のディレクトリ名(最後に/をつける必要なし) * 戻り値:成功した場合はアップロード後のファイル名(保存されたファイル名) * 失敗した場合にはfalse ***************************************************/ public function upload_files($data,$name,$dir){ if(!empty($data["tmp_name"]) && $data["size"]>0){ $name_array = explode(".",$data["name"]); $extention = $name_array[count($name_array)-1]; $new_name = $name.".".$extention; $file_path = $dir."/".$new_name; if(move_uploaded_file($data["tmp_name"],$file_path)){ return $new_name; }else{ return false; } }else{ return false; } }
cakePHPで使用する場合はcomponentに定義しておき、以下のように実行すると良いと思います。
DataConponent.phpに定義してあるとして、
$data = $this->data; $date = date("YmdHis"); $movie_name = $date."_movie_name"; $thimbnail_name = $date."_thumbnail_name"; $text_book_name = $date."_text_book_name"; $movie_chk = $this->Data->upload_files($data["Lesson"]["movie_name"],$movie_name,"../webroot/movies"); $thumbnail_chk = $this->Data->upload_files($data["Lesson"]["thumbnail_name"],$thimbnail_name,"../webroot/img/thumbnails"); $text_chk = $this->Data->upload_files($data["Lesson"]["text_book_name"],$text_book_name,"../webroot/text_book");
これでwedrootに用意した各ディレクトリにファイルがアップロードされます。
しかし、これは拡張子を変えずにどんなファイルもアップロードしてしまうため、外部からのアップロードには使用しないことをお勧めします。
HPの管理者側のアップロードを簡単に実装したい場合にはこれで十分だとは思います。
また、ファイルの分類は拡張子で行っているため、本体$_FILES["●●"]["type"]で行うよりもセキュリティー上弱くなっています。
また、upload_files()の返り値はアップロードしたファイルの新しい名前になりますので、DBに登録する必要がある場合には返り値を変数で受け取って、クエリ用に整形した配列からDBにsaveすることになると思います。