素のPHPでアップロードする方法をおさらいして、Laravelでのやり方も調べる。
DBに格納もできるが、とりあえずファイルとして保存。
##素のPHPでのアップロード
###HTML
いまさらですが、enctype="multipart/form-data"とする。
<!doctype html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>test</title>
</head>
<body>
<form method="post" action="res.php" enctype="multipart/form-data">
ファイル:<input type="file" name="up_file"><br>
<input type="submit" value="upload">
</form>
</body>
</html>
###PHP
エラーチェックをすればキリがないが、一番簡単なのはこんな感じ。
<?php
//一字ファイルができているか(アップロードされているか)チェック
if(is_uploaded_file($_FILES['up_file']['tmp_name'])){
//一字ファイルを保存ファイルにコピーできたか
if(move_uploaded_file($_FILES['up_file']['tmp_name'],"./".$_FILES['up_file']['name'])){
//正常
echo "uploaded";
}else{
//コピーに失敗(だいたい、ディレクトリがないか、パーミッションエラー)
echo "error while saving.";
}
}else{
//そもそもファイルが来ていない。
echo "file not uploaded.";
}
覚えておく変数?は、
- $_FILES['up_name']['tmp_name']
- $_FILES['up_ename']['name']
- $_FILES['up_name']['size']
くらいでしょうか(up_nameはform側のname)。
###その他
同時に<input type="text" name="email">等を送りたい場合は、普通にformに追加し、$_POST['email']で受ける。
##Laravel
Laravelで受ける。
###HTML(View)
私はHelperは使わない派なので、素です。csrf_token()をhiddenで送る必要があるくらい。
<!doctype html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>test</title>
</head>
<body>
<form method="post" action="upload" enctype="multipart/form-data">
ファイル:<input type="file" name="up_file"><br>
<input type="hidden" name="_token" value="<?php echo csrf_token(); ?>">
<input type="submit" value="upload">
</form>
</body>
</html>
###Laravel(本当はControll)
本当はControllに書くのですが、めんどいのでRouteに全部書きました。もっともシンプルなパターン。
getとも載せてますが、受けてるのはpostの方。
//get
Route::get('upload',function(){
return view('upload');
});
//post(受け取り)
Route::post('upload',function(){
$file = Request::file('up_file');
$name = $file->getClientOriginalName();
$move = $file->move('./',$name);
if($move){
return "uploaded";
}else{
return "error";
}
});
覚えておくべきプロパティ名は、
- getClientOriginalName()
- getClientSize()
- guessClientExtension()
などでしょうか。あとはmove()メソッド。引数が、move(保存先DIR名,保存ファイル名)とちょっと癖がある。
L4ではInputが主だったようですが、L5ではRequestに統一?されたのかな。Inputも使えますが。
###その他
同時に<input type="text" name="email">等を送りたい場合は、普通にformに追加し、Request::input('email')で受ける。
###備忘
Intervention Imageというのを使うと、いろいろと加工ができるみたい。また別の機会にためします。