Laravel 12 多文件上传示例

109 阅读1分钟

第 1 步:安装 Laravel 12

laravel new example-app

步骤 2:创建迁移和模型

php artisan make:migration create_files_table
<?php

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

return new class extends Migration
{
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        Schema::create('files', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::dropIfExists('files');
    }
};

php artisan migrate
php artisan make:model File

<?php
  
namespace App\Models;
  
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
  
class File extends Model
{
    use HasFactory;
  
    protected $fillable = [
        'name'
    ];
}

第 3 步:创建 Controller

<?php
  
namespace App\Http\Controllers;
       
use Illuminate\Http\Request;
use Illuminate\View\View;
use Illuminate\Http\RedirectResponse;
use App\Models\File;
      
class FileController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index(): View
    {
        return view('fileUpload');
    }
       
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request): RedirectResponse
    {
        // Validate incoming request data
        $request->validate([
            'files' => 'required|array',
            'files.*' => 'required|mimes:pdf,xlx,csv|max:2048',
        ]);
 
        // Initialize an array to store file information
        $files = [];
  
        // Process each uploaded file
        foreach($request->file('files') as $file) {
            // Generate a unique name for the file
            $fileName = time() . '_' . uniqid() . '.' . $file->getClientOriginalExtension();
              
            // Move the file to the desired location
            $file->move(public_path('uploads'), $fileName);
  
            // Add file information to the array
            $files[] = ['name' => $fileName];
        }
  
        // Store files in the database using create method
        foreach ($files as $fileData) {
            File::create($fileData);
        }
          
        return back()->with('success', 'Files uploaded successfully!')
                     ->with('files', $files); 
   
    }
}


$file->storeAs('files', $fileName);
  
// storage/app/files/file.png

$file->move(public_path('files'), $fileName);
  
// public/files/file.png

$file->storeAs('files', $fileName, 's3');

Step 4: Create Routes  第 4 步:创建路由


<?php
  
use Illuminate\Support\Facades\Route;
  
use App\Http\Controllers\FileController;
  
Route::get('file-upload', [FileController::class, 'index']);
Route::post('file-upload', [FileController::class, 'store'])->name('file.store');

第 5 步:创建 Blade 文件


<!DOCTYPE html>
<html>
<head>
    <title>Laravel 12 Multiple File Upload Example - ItSolutionStuff.com</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet" crossorigin="anonymous">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css" />
</head>
        
<body>
<div class="container">
  
    <div class="card mt-5">
        <h3 class="card-header p-3"><i class="fa fa-star"></i> Laravel 12 Multiple File Upload Example - ItSolutionStuff.com</h3>
        <div class="card-body">
  
            @session('success')
                <div class="alert alert-success" role="alert"> 
                    {{ $value }}
                </div>
            @endsession
            
            <form action="{{ route('file.store') }}" method="POST" enctype="multipart/form-data" class="mt-2">
                @csrf
        
                <div class="mb-3">
                    <label class="form-label" for="inputFile">Select Files:</label>
                    <input 
                        type="file" 
                        name="files[]" 
                        id="inputFile"
                        multiple 
                        class="form-control @error('files') is-invalid @enderror">
        
                    @error('files')
                        <span class="text-danger">{{ $message }}</span>
                    @enderror
                </div>
         
                <div class="mb-3">
                    <button type="submit" class="btn btn-success"><i class="fa fa-save"></i> Upload</button>
                </div>
             
            </form>
        </div>
    </div>
</div>
</body>
      
</html>

image.png