Upload Multiple File trong Laravel 8

Upload Multiple File hay còn gọi là upload nhiều file cùng lúc. Nó được sử dụng trong quá trình upload nhiều ảnh sản phẩm nổi bật cho một sản phẩm trong quá trình lập trình web bán hàng.

Bài viết này tôi chia sẻ nhanh cách để có thể tạo chức năng Upload Multiple File với Laravel 8 với các chức năng chính:

  • Hiển thị form upload
  • Xử lý upload file
  • Lưu trữ file upload vào folder trên dự án đồng thời lưu thông tin file vào database
  • Hiển thị danh sách file đã upload
  • Xóa file file đã upload

Bây giờ bạn hãy thao tác theo từng bước để tạo ra chức năng upload multiple file bằng laravel trên dự án của mình.

Bước 1: Tải dự án Laravel 8

Ở bước đầu tiên, chúng ta sẽ tải xuống mã nguồn và tạo dự án mới giản mới của dự án Laravel App bằng cách nhập một số lệnh sau.

composer create-project --prefer-dist laravel/laravel multipleUpload

Bước 2: Tạo Form Upload

Đầu tiên, tạo một form HTML cho phép người dùng chọn và upload nhiều file.

File: resources/views/files/upload.blade.php

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Upload Multiple Files</title>
</head>
<body>
    <h1>Upload Multiple Files</h1>
    <form action="{{ route('files.upload') }}" method="POST" enctype="multipart/form-data">
        @csrf
        <label for="files">Choose files:</label>
        <input type="file" name="files[]" multiple>
        <button type="submit">Upload</button>
    </form>
</body>
</html>

Tạo file view resources/views/files/index.blade.php để hiển thị danh sách file:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Uploaded Files</title>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css">
</head>
<body>
    <div class="container mt-5">
        <h3 class="mb-4">Danh sách file đã upload</h3>

        @if($files->isEmpty())
            <div class="alert alert-warning">Chưa có file nào được upload.</div>
        @else
            <table class="table table-bordered">
                <thead>
                    <tr>
                        <th>#</th>
                        <th>Tên File</th>
                        <th>Thời Gian Upload</th>
                        <th>Hành Động</th>
                    </tr>
                </thead>
                <tbody>
                    @foreach($files as $file)
                        <tr>
                            <td>{{ $loop->iteration }}</td>
                            <td>{{ basename($file->filename) }}</td>
                            <td>{{ $file->created_at->format('d-m-Y H:i') }}</td>
                            <td>
                                <a href="{{ asset('storage/' . $file->filename) }}" class="btn btn-info btn-sm" target="_blank">Xem</a>
                                <form action="{{ route('files.delete', $file->id) }}" method="POST" style="display:inline;">
                                    @csrf
                                    @method('DELETE')
                                    <button type="submit" class="btn btn-danger btn-sm">Xóa</button>
                                </form>
                            </td>
                        </tr>
                    @endforeach
                </tbody>
            </table>
        @endif
    </div>
</body>
</html>

2. Tạo Route

Thêm route để hiển thị form và xử lý upload.

File: routes/web.php

use App\Http\Controllers\FileUploadController;

Route::get('/upload', [FileUploadController::class, 'showForm'])->name('files.form');
Route::post('/upload', [FileUploadController::class, 'uploadFiles'])->name('files.upload');
Route::get('/files', [FileUploadController::class, 'showFiles'])->name('files.index');
Route::delete('/files/{file}', [FileUploadController::class, 'deleteFile'])->name('files.delete');

3. Tạo Controller

Tạo một controller để xử lý logic upload file.

Command:

php artisan make:controller FileUploadController

File: app/Http/Controllers/FileUploadController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;
use App\Models\File;

class FileUploadController extends Controller
{
    // Hiển thị form upload
    public function showForm()
    {
        return view('files.upload');
    }

    // Xử lý upload nhiều file
    public function uploadFiles(Request $request)
    {
        // Validate các file
        $request->validate([
            'files.*' => 'required|file|mimes:jpg,jpeg,png,pdf|max:2048',
        ]);

        // Lưu trữ các file
        $uploadedFiles = $request->file('files');
        $paths = [];

        foreach ($uploadedFiles as $file) {
            // Lưu file vào storage
            $path = $file->store('uploads', 'public');
            $paths[] = $path;

            // Lưu thông tin vào database
            File::create(['filename' => $path]);
        }

        return response()->json([
            'message' => 'Files uploaded and saved to database successfully!',
            'paths' => $paths,
        ]);
    }

    // Hiển thị danh sách file
    public function showFiles()
    {
        // Lấy danh sách file từ database
        $files = File::all();

        // Trả về view với dữ liệu file
        return view('files.index', compact('files'));
    }
    public function deleteFile(File $file)
    {
        // Xóa file khỏi storage
        Storage::disk('public')->delete($file->filename);
        
        // Xóa record trong database
        $file->delete();
        
        return back()->with('success', 'File deleted successfully.');
    }
}

4. Cấu hình Storage

Đảm bảo rằng bạn đã cấu hình disk public trong file config/filesystems.php.

File: config/filesystems.php

'disks' => [
    'public' => [
        'driver' => 'local',
        'root' => storage_path('app/public'),
        'url' => env('APP_URL') . '/storage',
        'visibility' => 'public',
    ],
],

Sau đó, chạy lệnh dưới đây để tạo symbolic link từ thư mục storage đến thư mục public:

php artisan storage:link

5. Tạo Database Qua Migration và Model

5.1. Cấu hình database

Mở file .env trong thư mục gốc của dự án Laravel và cập nhật thông tin database:

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel_upload
DB_USERNAME=root
DB_PASSWORD=

Thay đổi DB_USERNAME và DB_PASSWORD phù hợp với cấu hình MySQL của bạn.

CREATE DATABASE laravel_upload;

5.2. Tạo migration

Chạy lệnh tạo migration để tạo bảng lưu thông tin file:

php artisan make:migration create_files_table --create=files

Mở file migration vừa tạo trong thư mục database/migrations (ví dụ: 2024_12_29_123456_create_files_table.php) và cập nhật nội dung như sau:

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateFilesTable extends Migration
{
    public function up()
    {
        Schema::create('files', function (Blueprint $table) {
            $table->id();
            $table->string('filename');
            $table->timestamps();
        });
    }

    public function down()
    {
        Schema::dropIfExists('files');
    }
}

Chạy lệnh để thực hiện migration:

php artisan migrate

5.3. Tạo model

Chạy lệnh tạo model:

php artisan make:model File

Mở file model vừa tạo trong app/Models/File.php và cập nhật nội dung như sau:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class File extends Model
{
    use HasFactory;

    protected $fillable = ['filename'];
}

6. Kiểm tra Kết quả

Truy cập đường dẫn http://localhost/multipleUpload/upload để mở form upload.

Chọn nhiều file và nhấn “Upload”.

Các file sẽ được lưu trong thư mục storage/app/public/uploads.

Ngoài ra bạn có thể chạy dự án bằng cách đưa dự án multipleUpload vào Visual Studio Code sau đó mở terminal và chạy lệnh

php artisan serve

Sau khi chạy, bạn sẽ thấy thông báo tương tự như sau:

Starting Laravel development server: http://127.0.0.1:8000

Mở trình duyệt web và truy cập địa chỉ:

http://127.0.0.1:8000/upload

Kết luận

Trong bài này tôi đã hướng dẫn tổng quan cách để tạo chức năng upload multiple file(nhiều file) bằng Laravel.

Bạn cần xem qua để năm quy trình sau đó hãy tạo dự án theo từng bước đã được chia sẻ ở trên.

Nếu bạn muốn học lập trình web với Laravel hiệu quả để đi làm bạn có thể xem qua lộ trình Laravel Pro.

Nếu có câu hỏi gì thêm bạn chia sẻ ở phần comment bên dưới!

Subscribe
Notify of
guest

0 Comments
Newest
Oldest Most Voted
Inline Feedbacks
View all comments
0
Bạn đang nghĩ gì? Hãy để lại bình luận tại đâyx
()
x