ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
| この記事の要点 |
|
Laravel の storage ディレクトリ構成
storage/
├── app/
│ ├── public/ ← public ディスク。ブラウザ公開ファイル(要 symlink)
│ └── private/ ← 非公開ファイル(ログイン後ダウンロード等)
├── framework/
│ ├── cache/ ← フレームワークキャッシュ
│ ├── sessions/ ← セッションファイル(file driver)
│ ├── testing/
│ └── views/ ← Blade コンパイル済キャッシュ
└── logs/
└── laravel.log ← アプリケーションログ
ブラウザから直接アクセスできるのは public/ 配下のみ。storage/app/public/ を公開するにはシンボリックリンクを張ります。
storage:link コマンド
# プロジェクトルートで
php artisan storage:link
# 出力
# The [public/storage] link has been connected to [storage/app/public].
# 実体確認
ls -la public/storage
# lrwxrwxrwx 1 user user 33 May 17 12:00 public/storage -> /path/to/storage/app/public
これで storage/app/public/photos/cat.jpg は http://example.com/storage/photos/cat.jpg でアクセス可能になります。
権限設定
Web サーバー(Apache / Nginx)から書き込みできないと「Permission denied」エラー:
# 所有者を Web サーバーユーザーに
sudo chown -R www-data:www-data storage bootstrap/cache
# 書き込み権限
sudo chmod -R 775 storage bootstrap/cache
# 一般ユーザーも所属させたい(開発時)
sudo usermod -aG www-data $USER
# ログアウト → 再ログイン
# SELinux 環境(CentOS / RHEL)
sudo chcon -R -t httpd_sys_rw_content_t storage bootstrap/cache
sudo setsebool -P httpd_unified 1
ファイルアップロード処理
// app/Http/Controllers/PhotoController.php
public function store(Request $request)
{
$request->validate([
'photo' => 'required|image|max:5120', // 5MB
]);
// 方法1: 自動生成ファイル名で storage/app/public/photos/ に保存
$path = $request->file('photo')->store('photos', 'public');
// → "photos/abc123.jpg"
// 方法2: ファイル名指定
$path = $request->file('photo')->storeAs(
'photos',
'user_' . auth()->id() . '.jpg',
'public'
);
// 方法3: Storage Facade
use Illuminate\Support\Facades\Storage;
Storage::disk('public')->putFileAs(
'photos',
$request->file('photo'),
'cat.jpg'
);
return view('photo.show', ['url' => Storage::url($path)]);
}
表示・URL 生成
use Illuminate\Support\Facades\Storage;
// DB に保存した相対パス: "photos/abc123.jpg"
$photo = Photo::find(1); // path = "photos/abc123.jpg"
// 公開 URL
$url = Storage::url($photo->path);
// → "/storage/photos/abc123.jpg"
// asset() でも同じ
$url = asset('storage/' . $photo->path);
// 絶対パスが必要なとき
$url = Storage::disk('public')->url($photo->path);
// → "http://example.com/storage/photos/abc123.jpg"
// ファイルが存在するか
if (Storage::disk('public')->exists($photo->path)) { ... }
// 削除
Storage::disk('public')->delete($photo->path);{{-- Blade --}}
<img src="{{ Storage::url($photo->path) }}" alt="">
<img src="{{ asset('storage/'.$photo->path) }}" alt="">
非公開ファイル(ログイン認証付ダウンロード)
// 非公開ファイルは storage/app/ 直下に保存(symlink 不要)
$path = $request->file('contract')
->storeAs('contracts/' . auth()->id(), 'contract.pdf');
// → storage/app/contracts/123/contract.pdf (public からアクセス不可)
// コントローラーで認証 + ダウンロード
public function download($id)
{
$doc = Document::findOrFail($id);
if ($doc->user_id !== auth()->id()) abort(403);
return Storage::download($doc->path);
// または
return Storage::response($doc->path);
}
カスタムディスク追加
// config/filesystems.php
'disks' => [
// 既存
'public' => [
'driver' => 'local',
'root' => storage_path('app/public'),
'url' => env('APP_URL').'/storage',
'visibility' => 'public',
],
// 追加: 画像専用ディスク
'images' => [
'driver' => 'local',
'root' => storage_path('app/public/images'),
'url' => env('APP_URL').'/storage/images',
'visibility' => 'public',
],
// S3
's3' => [
'driver' => 's3',
'key' => env('AWS_ACCESS_KEY_ID'),
'secret' => env('AWS_SECRET_ACCESS_KEY'),
'region' => env('AWS_DEFAULT_REGION'),
'bucket' => env('AWS_BUCKET'),
'url' => env('AWS_URL'),
],
],
本番デプロイ時の注意
php artisan storage:linkはデプロイのたびに必要。デプロイスクリプトに含める- Symlink が動かないホスティング(一部のシェアードホスティング)では
.htaccessで代用 - S3 / Cloudflare R2 等のクラウドストレージに切り替えるとサーバー間共有 / バックアップが楽
- storage 配下を Git 管理しない(
.gitignoreにstorage/app/public/*)
FAQ
Q: php artisan storage:link がエラーになる
A: 既に public/storage が存在すると失敗します。rm public/storage してから再実行。
Q: アップロード後にファイルが見えない
A: ① symlink 未作成 → storage:link、② 権限不足 → chmod 775、③ public/storage がディレクトリとして実在(symlink でない)→ 削除して再作成。
Q: 大きなファイル(数百 MB)が保存できない
A: php.ini の upload_max_filesize / post_max_size / memory_limit を増やす。Web サーバー側のサイズ制限(Nginx client_max_body_size)も。
ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
子ページ
子ページはありません
同階層のページ
- インストールと設定
- クイックスタート & チュートリアル(初心者向け)
- クイックスタート & チュートリアル(中級者向け)
- ルーティング
- Bladeテンプレート(ビュー/レイアウト)
- コントローラー
- マイグレーションとテーブル定義
- データベースの設定
- Eloquentモデル (ORM)
- SQLとクエリビルダー
- バリデーション
- .envファイルの設定値へのアクセス
- 動作環境による分岐処理
- configフォルダ配下の設定値へのアクセス
- assetヘルパーを利用したpublicフォルダへのアクセス
- storageフォルダへのアクセス
- アプリケーション名の変更
- メンテナンス
- ログイン画面(認証システム)の作成
- ログインの必須化
- ログインユーザー情報の取得
- ルートの認証化
- 本番サーバーへのデプロイ方法
- 多言語化
- csrf_field
- ファイルのダウンロード
- CSVのアップロードおよび読み込み(maatwebsite/excel)
- ページタイトルの設定
- コマンド一覧
- エラー一覧
- SQLの実行ログ出力方法
- キャッシュのクリア
- Selectの結果の最初もしくは最後に任意の値を追加する方法
- ajaxでPOST通信する際の注意点
- ソーシャルログインの実装
- セッション情報の確認
- ログイン、ユーザー登録、パスワードリセット後のリダイレクト先の変更方法
- redirectやreturn viewにメッセージを付与する方法
- クッキー(cookie)の設定と取得
- クラスの再読み込み
- csrfの有効時間を変更する方法
- ViewComposerを用いてviewに共通の値を付与する方法
- View::shareを用いて共通の値を各ビューに渡す方法
- ミドルウェアを用いた処理の共通化
- Middleware内でAuth::check()などを使用する方法
- Controller以外でリダイレクトする方法
- セッションの値の取得/保存/更新/削除
- $requestの値を変更する方法
- 常時SSL化
- ページング(ページネーション)をする方法
- vue.jsとの連携
- Vue.jsと連携するSPA実行環境構築
- .envの値をvue.jsで参照する方法
- vue.jsを本番環境にリリースする方法
- could not find driver(Windows, MySQL編)
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 Spring Frameworkのアノテーション一覧
- 7 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- PHPでのファイルアップロード方法|multipart/form-dataと$_FILES 2026-08-07 17:15:57
- PHP $_SERVERとは|DOCUMENT_ROOT・PHP_SELFなど主な要素 2026-08-07 17:15:57
- Scratchのアカウントの作り方|メールアドレスとユーザー名の登録手順 2026-08-07 17:15:57
- djangoにおけるMVCアプリケーション実装例 2026-08-07 17:15:57
- Bluetoothとは|仕組み・BLEとClassicの違い・用途 2026-08-07 17:15:57
- Spring Bootのテスト入門|@SpringBootTestとJUnitでの単体・結合テスト 2026-08-07 17:15:57
- Java とは?言語仕様・JVM・主要フレームワーク一覧 2026-08-07 17:15:56
- インストール方法(Windows版) 2026-08-07 17:15:56
- APIキー取得方法 2026-08-07 17:15:56
- 【PHPフレームワーク】Laravelの使い方 2026-08-07 17:15:56
- Scratch 作品の公開方法 2026-08-07 17:15:56
- Google OAuth 2.0 認証の実装方法 2026-08-07 17:15:56
- データベースとは?RDB / NoSQL / SQL の基礎 2026-08-07 17:15:56
- インストール(eclipseプラグイン) 2026-08-07 17:15:56
- Spring Frameworkの使い方 2026-08-07 17:15:56
コメントを削除してもよろしいでしょうか?