68
93

More than 5 years have passed since last update.

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

Posted at

素の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

68
93
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
68
93