Laravelを使ってファイルをアップロードする方法について詳細に説明を行なっています。アップロードしたファイルのブラウザからの閲覧方法についても説明を行なっているので、ファイルのアップロードの参考にしてください。

アップロードフォームの作成

ファイルをアップロードするためには、フォームの作成を行う必要があります。フォームを表示、ファイルをアップロードするためのルーティングをweb.phpに追加します。


Route::resource('/upload', 'UploadController');

設定したコントローラーUploadControllerの作成を行います。


<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class UploadController extends Controller
{
    public function index(){

    	return view('index');
    }

}

ビューファイルの作成を行います。index.blade.phpファイルを作成し、ファイルをアップロードするためのフォームを作成します。

ファイルのアップロードを行う場合は、enctype=”multipart/form-data”は忘れずにform要素に設定をしてください。


<!DOCTYPE html>
<html lang="ja">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>

	<form method="POST" action="/upload/" enctype="multipart/form-data">

		{{ csrf_field() }}

	<input type="file" id="file" name="file" class="form-control">

	<button type="submit">アップロード</button>

	</form>

</body>
</html>

ルーティングに設定した/uploadにアクセスするとファイルをアップロードするためのフォームが表示されます。

アップロードフォーム

アップロードフォーム

アップロードしたフィルの情報確認

作成したフォームからファイルをアップロードして、アップロードしたファイルの情報を確認してみましょう。


public function store(Request $request){
    dd($request->all());
}

dump&dieコマンド(dd)を実行するとアップロードしたファイルの情報を確認することができます。


array:2 [▼
  "_token" => "3bSrdIPLL3alM6iH3pYJIKRDEDXnZHcmWhOi3dCK"
  "file" => UploadedFile {#204 ▼
    -test: false
    -originalName: "アップロードファイル.pdf"
    -mimeType: "application/pdf"
    -error: 0
    #hashName: null
    path: "/private/var/folders/5h/bxvtcnj978dfmqwdkr59xvj40000gn/T"
    filename: "php3fAJXn"
    basename: "php3fAJXn"
    pathname: "/private/var/folders/5h/bxvtcnj978dfmqwdkr59xvj40000gn/T/php3fAJXn"
    extension: ""
    realPath: "/private/var/folders/5h/bxvtcnj978dfmqwdkr59xvj40000gn/T/php3fAJXn"
    aTime: 2018-12-31 02:23:19
    mTime: 2018-12-31 02:23:19
    cTime: 2018-12-31 02:23:19
    inode: 1084426
    size: 208312
    perms: 0100600
    owner: 501
    group: 20
    type: "file"
    writable: true
    readable: true
    executable: false
    file: true
    dir: false
    link: false
  }
]

ddコマンドでは、フォームから送られてくるすべての情報を表示していましたが、ファイルのみの情報を表示させるためにfileメソッドを利用します。


 dd($request->file('file'));

fileメソッドを利用するとmime typeやサイズの情報も確認することができます。ファイルの情報は、UploadFileインスンスに保存されていることも下記の情報からわかります。


UploadedFile {#204 ▼
  -test: false
  -originalName: "アップロードファイル.pdf"
  -mimeType: "application/pdf"
  -error: 0
  #hashName: null
  path: "/private/var/folders/5h/bxvtcnj978dfmqwdkr59xvj40000gn/T"
  filename: "php01V3en"
  basename: "php01V3en"
  pathname: "/private/var/folders/5h/bxvtcnj978dfmqwdkr59xvj40000gn/T/php01V3en"
  extension: ""
  realPath: "/private/var/folders/5h/bxvtcnj978dfmqwdkr59xvj40000gn/T/php01V3en"
  aTime: 2018-12-31 02:26:38
  mTime: 2018-12-31 02:26:38
  cTime: 2018-12-31 02:26:38
  inode: 1084476
  size: 208312
  perms: 0100600
  owner: 501
  group: 20
  type: "file"
  writable: true
  readable: true
  executable: false
  file: true
  dir: false
  link: false
}

アップロードしたファイルの保存

アップロードしたファイル情報を保持するUploadFileクラスはファイルを保存するためのstoreメソッドを持っています。storeメソッドを利用することで、サーバ上に簡単にファイルの保存を行うことができます。ファイルが保存される場所はLaravelインストールディレクトリの下にあるstorage/appです。


public function store(Request $request){

   $request->file('file')->storeAs('public/','upload_file.pdf');
		
}

サーバ上でファイルが保存されているか確認します。ファイル名は、Laravel側で自動で付与されます。


mac$ pwd
/Users/mac/Documents/laravel/storage/app
mac$ ls
1bRLVYORlvI5curaPFUVob8DVMUBpSL1D2zJcXFS.pdf
public

任意の名前をつけてファイルを保存

アップロードしたファイル名または、任意の名前を付けたい場合は、storeAsメソッドを利用します。


$request->file('file')->storeAs('','upload_file.pdf');

storeASメソッドで指定したファイル名で保存されることが確認できます。


mac$ pwd
/Users/mac/Documents/laravel/storage/app
mac$ ls
1bRLVYORlvI5curaPFUVob8DVMUBpSL1D2zJcXFS.pdf
public
upload_file.pdf

アップロードしたファイル名をつけて保存

getClientOriginalNameメソッドを利用すると拡張子を含め、アップロードしたファイルのファイル名を取得することができます。


$file_name = $request->file('file')->getClientOriginalName();

$request->file('file')->storeAs('',$file_name);

アップロードしたフィイル名であるアップロードファイル.pdfとしてファイルが保存されています。日本語ファイルも文字化けされることなく問題なく保存されることも確認できます。


mac$ pwd
/Users/mac/Documents/laravel/storage/app
mac$ ls
1bRLVYORlvI5curaPFUVob8DVMUBpSL1D2zJcXFS.pdf
public
upload_file.pdf
アップロードファイル.pdf

アップロードしたファイルの閲覧

シンボリックリンクの作成

アップロードしただけでは、ブラウザからアップロードしたファイルを閲覧することはできません。ブラウザからサーバ上のファイルにアクセスするためには、Laravelインストールディレクトリの下にあるpublicディレクトリの下に保存する必要があります。しかし、アップロードしたファイルは/storage/appの下にあるためアクセスすることができません。/publicディレクトリと/storage/appディレクトリとの間でリンクを持たせる必要があります。

Laravelではリンクを貼る設定を行う機能も備えています。php artisan storage:linkを実行します。


mac$ php artisan storage:link
The [public/storage] directory has been linked.

/publicディレクトリの下にstorageディレクトリが作成され、/storage/app/publicへリンボクンクリンクが張られます。


mac$ pwd
/Users/mac/Documents/laravel/public
mac$ ls -l storage
lrwxr-xr-x  1 mac  staff  47 12 31 11:55 storage -> /Users/mac/Documents/laravel/storage/app/public

シンボリックリンクが張られることにより、/storage/app/publicの下にupload.pdfファイルを保存すると/public/storageからupload.pdfにアクセス可能となります。

ファイルの保存

/storage/spp/publicの下にアップロードしたファイルを保存します。ファイルを保存するためにUploadController.phpのstorsAsメソッドの変更を行います。


$request->file('file')->storeAs('public/','upload_file.pdf');

storeAsメソッドでは、storage/appディレクトリにファイルが保存されるため、publicを設定するとstorage/app/publiにファイルが保存されます。

ファイルがstorage/app/publicディレクトリの下に保存されていることが確認できます。


mac$ pwd
/Users/mac/Documents/laravel/storage/app/public
mac$ ls
upload_file.pdf

シンボリックリンクが設定されているため、public/storage/ディレクトリからもupload_file.pdfファイルへアクセスすることができます。


mac$ pwd
/Users/mac/Documents/laravel/public/storage
mac$ ls
upload_file.pdf

ブラウザからのファイルの閲覧

publicディレクトリに下に置いたファイルは、ブラウザからアクセスできるため、保存したファイルを閲覧してみましょう。index.blade.htmlのビューファイルに下記の行を追加します。


<a href="/storage/upload_file.pdf">アップロードファイル</a>

ブラウザで下記のように表示されます。

アップロードファイルのリンク表示

アップロードファイルのリンク表示

リンク部分をクリックするとPDFの内容がブラウザに表示されます。

リンクからPDFファイルの中身を確認

リンクからPDFファイルの中身を確認