PHPでのファイルアップロードのおさらい

More than 1 year has passed since last update.

素の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というのを使うと、いろいろと加工ができるみたい。また別の機会にためします。

Intervention Image

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.