【Laravel×Dropzone.js】ドラッグ&ドロップ対応のアップロード機能を構築する
はじめに
Webアプリケーションを開発していくうえでドラッグ&ドロップ対応のアップロード機能があると便利ですよね。
この記事では、Laravelに Dropzone.jsを組み合わせることでドラッグ&ドロップ対応のファイルアップロード機能を実装します。
開発環境
今回は以下の開発環境において検証しました。
- OS: Windows 11
- Web Server: XAMPP v3.3
- PHP: 8.2.12
- Laravel Framework: 11.40.0
Laravelプロジェクトの構築
-
Laravelプロジェクトを新規作成します。
$ composer create-project laravel/laravel drag-drop-upload-app $ cd drag-drop-upload-app $ php artisan serve
ブラウザ上で localhost にアクセスし、アプリケーションが正しく動作しているか確認します。問題がなければ、ターミナルで Ctrl + C を押してサーバーを一旦停止します。
-
データベーステーブルを作成します。
$ php artisan make:migration create_files_table --create=files
作成したマイグレーションファイルを次のように設定します。
yyyy_MM_dd_HHmmss_create_files_table.phppublic function up() { Schema::create('files', function (Blueprint $table) { $table->id(); $table->string('name'); $table->string('path'); $table->timestamps(); }); }
-
テーブルのマイグレーションを実行します。
$ php artisan migrate
-
ルートを設定します。
routes/web.php
に次のコードを追加します。web.phpuse Illuminate\Support\Facades\Route; use App\Http\Controllers\FileUploadController; Route::get('/', function () { return view('welcome'); }); Route::get('/upload', function(){ return view('upload'); }); Route::post('/upload', [FileUploadController::class, 'store']);
-
コントローラを実装します。
コントローラーを作成するために次のコマンドを実行します。$ php artisan make:controller FileUploadController
App\Http\Controllers\FileUploadController.php
が作成できたら、次のコードを追加します。FileUploadController.php<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use Illuminate\Support\Facades\Storage; class FileUploadController extends Controller { public function store(Request $request) { if ($request->hasFile('file')) { $file = $request->file('file'); $filename = time() . '_' . $file->getClientOriginalName(); $path = $file->storeAs('uploads', $filename, 'public'); return response()->json([ 'success' => true, 'file_path' => $path, 'file_name' => $filename ]); } return response()->json(['success' => false], 400); } }
UIの構築
続いて、resources/views/upload.blade.php
を作成し、次のコードを追加します。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>ファイルアップロード</title>
<script src="https://cdn.tailwindcss.com"></script>
<!-- Dropzone.js の CSS -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/dropzone/5.9.3/min/dropzone.min.css">
</head>
<body class="bg-gray-100 flex items-center justify-center min-h-screen">
<div class="w-full max-w-lg p-6 bg-white rounded-lg shadow-md">
<h1 class="text-2xl font-bold text-center text-gray-800 mb-6">ファイルアップロード</h1>
<form action="/upload" class="dropzone border-2 border-dashed border-blue-500 rounded-lg bg-gray-50 p-6 text-center" id="file-dropzone">
@csrf
<p class="text-gray-600">ここにファイルをドラッグ&ドロップするか、クリックして選択してください</p>
</form>
</div>
<!-- Dropzone.js の JavaScript -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/dropzone/5.9.3/min/dropzone.min.js"></script>
<script>
Dropzone.options.fileDropzone = {
maxFilesize: 2, // MB
acceptedFiles: ".jpeg,.jpg,.png,.gif",
dictDefaultMessage: "ここにファイルをドラッグ&ドロップしてください",
success: function(file, response) {
console.log(response);
alert("アップロードが成功しました: " + response.file_name);
},
error: function(file, response) {
alert("アップロードに失敗しました");
}
};
</script>
</body>
</html>
動作確認
ターミナルで以下のコマンドを実行し、開発サーバーを起動します。
php artisan serve
ブラウザで http://localhost/upload にアクセスし、ファイルアップロード機能が正しく動作するか確認します。問題無ければ、ブラウザ上に以下のように表示されます。
動作確認として、ドラッグ&ドロップしてファイルを追加すると、画像のサムネイルとステータスバーが画像上に表示されます。
画像のアップロードが成功すると通知されます。
こちらのように実装できたでしょうか?
おわりに
LaravelとDropzone.jsを使用することで、ドラッグ&ドロップ対応のファイルアップロード機能が簡単に実装できました。これにより、モダンなUIのファイル操作を実現できるのでぜひ参考にしてみてください。
株式会社ONE WEDGE
【Serverlessで世の中をもっと楽しく】
ONE WEDGEはServerlessシステム開発を中核技術としてWeb系システム開発、AWS/GCPを利用した業務システム・サービス開発、PWAを用いたモバイル開発、Alexaスキル開発など、元気と技術力を武器にお客様に真摯に向き合う価値創造企業です。
Discussion