LaravelのFilesystemsを利用してファイルをアップロード基礎基礎メモ
LaravelのFilesystemsを利用することで、ファイルストレージを簡単に設定することができます。 今回は「Local Storage」に保存してみたいと思います。
PHP初心者の私には割と時間がかかってしまったので忘れないようにメモしておきます。
S3に保存するのを試したメモはこちらです。
Filesystemの設定
Filesystemの設定はconfig/filesystems.php
にあります。 local、public、s3の設定がされています。
disk | 概要 |
---|---|
local | storage/app/に保存される。 ブラウザからのアクセスは不可。 |
public | storage/app/publicに保存される。 ブラウザからのアクセスは可。 ただしpublic/storageからstorage/app/publicへのシンボリックリンクを貼る必要がある |
s3 | 割愛 |
フロント側
Vue.jsを利用しています。 UIは以下のような感じ。
<template>
<div>
<input type="file" name="file" @change="selectedFile">
<button type="button" @click="upload">登録</button>
</div>
</template>
<script>
import axios from 'axios'
export default {
name: 'Upload',
data(){
return {
uploadFile:null
}
},
methods: {
selectedFile:(e) => {
let files = e.target.files
if (files.length) this.uploadFile = files[0]
},
upload:() => {
let data = new FormData()
data.append('file', this.uploadFile)
axios.post('/api/upload',data)
}
}
}
</script>
API側
Controllerだけ記載します。
<?php
namespace App\Http\Controllers\Api;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\User;
class UserController extends Controller
{
public function upload(Request $request,$id)
{
$user = User::find($id);
$thumbnail = $request->file('file');
$filename = time() . '.' . $thumbnail->getClientOriginalExtension();
// strage/app/public配下に保存される
$path =$thumbnail->storeAs('', $filename, ['disk' => 'public']);
$user->thumbnail = $path;
$user->save();
return $path;
}
}
storeAsを利用することで、保存するファイルに任意のファイル名を設定することができます。 第1引数 ・・・ 設定ファイルの指定しているrootディレクトリからのパス 第2引数 ・・・保存する際のファイル名 第3引数 ・・・利用するストレージ(local、public…など)
$thumbnail->storeAs('', $filename, ['disk' => 'public']);
シンボリックリンクを設定
保存するストレージにpublicを設定しても、ブラウザからアクセスすることはできません。 public/storage
から storage/app/public
へのリンボリックリンクを貼る必要があります。
当たり前なのかもしれませんが、シンボリックリンクは、Dockerや、Vagrantを利用している場合は内部で貼る必要があります。
$docker-compose exec --user=laradock workspace bash
$ php artisan storage:link
これで、http://hogehoge/storage/ファイル名
でアップロードしたファイルにアクセスすることができます。
もし、シンボリックリンクをはるときに以下のエラーが出た場合は/public
フォルダの中のstorageを削除してから、もう一度実行してみてください。
ErrorException : symlink(): No such file or directory
手順
cd public rm storage php artisan storage:link