Help us understand the problem. What is going on with this article?

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

More than 5 years have 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

zaburo
こんにちは。自分用のメモをだらだら公開しています。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away