Laravelで画像データをデータベースに保存する方法は以下の2種類があります。
1:画像をファイルシステムに保存して、データベースにそのパスを保存する方法
2:直接画像をデータベースに保存する方法(BLOB形式で保存)
一般的には1が推奨されますが、どちらも解説します。
方法1: ファイルシステムに画像を保存し、パスをデータベースに保存する
1. マイグレーションの設定
データベーステーブルに画像のパスを保存するためのカラムを用意します。
phpphp artisan make:migration add_image_path_to_users_table --table=users
作成されたマイグレーションファイルに以下を追加します:
phppublic function up()
{
Schema::table('users', function (Blueprint $table) {
$table->string('image_path')->nullable();
});
}
public function down()
{
Schema::table('users', function (Blueprint $table) {
$table->dropColumn('image_path');
});
}
その後、マイグレーションを実行します:
bashphp artisan migrate
2. コントローラーでファイルアップロード処理
コントローラーを作成し、画像ファイルをアップロードして保存します。
bashphp artisan make:controller UserController
コントローラーに以下を追加します:
phpuse Illuminate\Http\Request;
use App\Models\User;
class UserController extends Controller
{
public function store(Request $request)
{
// バリデーション
$request->validate([
'image' => 'required|image|mimes:jpeg,png,jpg,gif|max:2048',
]);
// ファイルアップロード
if ($request->hasFile('image')) {
$file = $request->file('image');
$path = $file->store('images', 'public'); // storage/app/public/images に保存される
// データベースに保存
$user = new User();
$user->name = $request->input('name');
$user->image_path = $path;
$user->save();
return response()->json(['message' => 'Image uploaded successfully']);
}
return response()->json(['message' => 'No image uploaded'], 400);
}
}
3. ストレージのシンボリックリンク作成
アップロードされた画像にブラウザからアクセスできるように、storageフォルダを公開します。
bashphp artisan storage:link
これにより、public/storageからstorage/app/publicのファイルにアクセスできるように
なります。
4. Bladeテンプレートで画像を表示
画像の表示には、保存したパスを使用します。
blade.php<img src="{{ asset('storage/' . $user->image_path) }}" alt="User Image">
方法2: 画像を直接データベースに保存(BLOB形式)
1. マイグレーションの設定
画像を保存するために、BLOBカラムを追加します。
bashphp artisan make:migration add_image_blob_to_users_table --table=users
マイグレーションファイルに以下を追加します:
phppublic function up()
{
Schema::table('users', function (Blueprint $table) {
$table->binary('image_blob')->nullable();
});
}
public function down()
{
Schema::table('users', function (Blueprint $table) {
$table->dropColumn('image_blob');
});
}
その後、マイグレーションを実行します:
bashphp artisan migrate
2. コントローラーで画像データを保存
画像をエンコードして保存します。
phppublic function store(Request $request)
{
// バリデーション
$request->validate([
'image' => 'required|image|mimes:jpeg,png,jpg,gif|max:2048',
]);
if ($request->hasFile('image')) {
$file = $request->file('image');
$imageData = file_get_contents($file);
// データベースに保存
$user = new User();
$user->name = $request->input('name');
$user->image_blob = $imageData;
$user->save();
return response()->json(['message' => 'Image uploaded successfully']);
}
return response()->json(['message' => 'No image uploaded'], 400);
}
3. 画像を表示
データベースから取得したBLOBデータを表示するには、Base64に変換します。
blade.php<img src="data:image/jpeg;base64,{{ base64_encode($user->image_blob) }}" alt="User Image">
どちらを選ぶべきか?
- ファイルシステム:大きな画像や頻繁な読み書きがある場合に適しており、
パフォーマンスが良い。 - データベース:画像を含む全てのデータを一箇所で管理したい場合や、
バックアップが容易になる利点がある。
一般的には、**方法1(ファイルシステムに保存)**が推奨されます。
php artisan storage:link コマンド
php artisan storage:link コマンドは、Laravelでストレージ(storageディレクトリ)内の
ファイルを公開するために使用するコマンドです。
このコマンドの目的や仕組みを詳しく説明します。
1. コマンドの目的
Laravelのファイルストレージは、デフォルトでは storage/app ディレクトリ内に保存されます。
このディレクトリは通常、直接公開されておらず、Webサーバー(ApacheやNGINX)経由で
アクセスできません。
php artisan storage:link コマンドを実行すると、以下のことを実現します:
storage/app/publicディレクトリの内容を公開用ディレクトリ(public/storage)に
リンクします。- アップロードされたファイルなど、
storage/app/publicに保存されたコンテンツを
ブラウザ経由でアクセスできるようになります。
2. コマンドの仕組み
php artisan storage:link は、シンボリックリンク(symbolic link) を作成します。
シンボリックリンクとは?
- シンボリックリンクは、あるディレクトリやファイルを指し示す仮想的な
ポインタのようなものです。 - 実体は別の場所にありながら、リンクを通じてその実体にアクセスできます。
コマンドの動作
このコマンドを実行すると、以下のようなシンボリックリンクが作成されます:
app/publicディレクトリにstorageディレクトリが作られ、storage/app/publicに
シンボリックリンクを作ります。
但し、シンボリックリンクを示す宣言等のファイルは現れません。
plaintextpublic/storage -> storage/app/public
これにより、storage/app/public ディレクトリに保存されたファイルが、Webサーバーの
公開ディレクトリ(public/)内の storage/ からアクセス可能になります。
3. 使用例
例えば、以下のコードで画像を保存する場合:
php$file = $request->file('image');
$path = $file->store('images', 'public'); // storage/app/public/images に保存される
保存された画像をブラウザからアクセスするには、storage/app/public/images に対応する public/storage/images を参照します。
リンクを作成していない場合、public/storage が存在しないため画像にアクセスできません。
実行後の構造イメージ
plaintextコードをコピーするproject/
├── storage/
│ ├── app/
│ ├── public/
│ ├── images/
│ └── example.jpg
├── public/
├── storage -> ../storage/app/public <-- シンボリックリンク
これにより、ブラウザで以下のようなURLで画像にアクセス可能になります:
urlhttp://your-app-url/storage/images/example.jpg
4. 必要な設定や注意点
Webサーバーの設定
- シンボリックリンクが適切に機能するには、Webサーバーがシンボリックリンクを許可
している必要があります。 - NGINX の場合、
disable_symlinks設定を確認してください。 - Apache の場合、
Options FollowSymLinksが有効である必要があります。
ファイルの公開に関するセキュリティ
storage/app/public以外のディレクトリ内容は公開されません。- プライベートなデータを公開用ディレクトリに保存しないように注意してください。
5. まとめ
php artisan storage:linkコマンドは、storage/app/publicをpublic/storageに
リンクするためのもの。- このリンクにより、アップロードされたファイルなどがWebサーバーを通じて
アクセス可能になる。 - シンボリックリンクを活用することで、Laravelのファイルストレージ機能を
効率的に利用できるようになります。
これにより、Laravelのストレージ機能が安全かつ便利に利用できる環境が整います。
ついでに、削除方法は、
Laravelで php artisan storage:link コマンドによって作成されたシンボリックリンクを
削除する方法は以下のように行います。
1. シンボリックリンクの場所
デフォルトでは、php artisan storage:link コマンドはプロジェクトの
public/storage にシンボリックリンクを作成します。
このリンクは次の構造を持ちます:
plaintextpublic/storage -> storage/app/public
削除したい対象は、この public/storage というシンボリックリンクです。
2. シンボリックリンクの削除方法
方法1: unlink コマンドを使用(Linux/Macの場合)
ターミナルで以下のコマンドを実行して、public/storage シンボリックリンクを削除できます:
bashunlink public/storage
方法2: rm コマンドを使用(Linux/Mac/Windowsの場合)
rm コマンドで削除することも可能です:
bashrm public/storage
方法3: 手動で削除
ファイルブラウザ(Finder、エクスプローラーなど)を使用して、public ディレクトリ内の storage を通常のファイルのように削除します。
3. シンボリックリンク削除時の注意点
- リンク先のデータは削除されない
シンボリックリンクを削除しても、リンク先のディレクトリ(storage/app/public)や
その内容は削除されません。削除するのはリンク(public/storage)だけです。 - 再作成は簡単
シンボリックリンクを削除しても、必要に応じてphp artisan storage:linkコマンドを
再実行するだけでリンクを再作成できます。
4. 例: シンボリックリンクの削除と確認
削除コマンドの実行:
bashunlink public/storage
削除されたか確認:
以下のコマンドで、リンクが削除されたか確認できます:
bashls -l public
storage の行が表示されなければ、削除成功です。
5. 削除後にリンクが必要な場合
削除した後で再び必要になった場合、単に以下を実行すれば再作成されます:
bashphp artisan storage:link
これらの手順を使用して、不要になったシンボリックリンクを安全に削除できます。


