のぐそんブログ

暗いおじさんがシコシコ書くブログです。

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