首页 > PHP > laravel教程 文件存储

laravel教程 文件存储

2025-03-03 15:07:30

在 Laravel 中,文件存储是一个常见的需求,比如用户上传头像、上传文件等。Laravel 提供了强大且灵活的文件存储系统,它支持多种存储驱动,如本地磁盘、Amazon S3、Rackspace 等。下面为你详细介绍 Laravel 文件存储的使用教程。

1. 配置文件存储

Laravel 的文件存储配置文件位于 config/filesystems.php。该文件定义了多个存储磁盘,默认情况下有 local(本地磁盘)、public(用于公共可访问的文件)和 s3(Amazon S3 存储)。

'disks' => [
    'local' => [
        'driver' => 'local',
        'root' => storage_path('app'),
    ],

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

    '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'),
        'endpoint' => env('AWS_ENDPOINT'),
    ],
],

2. 链接公共存储

如果你要使用 public 磁盘来存储用户可以公开访问的文件,需要创建一个从 public/storage 到 storage/app/public 的符号链接。可以使用以下 Artisan 命令来完成:

php artisan storage:link

3. 文件上传

3.1 创建表单

首先,创建一个 HTML 表单来允许用户上传文件。在 Blade 模板中可以这样写:

<form action="{{ route('file.upload') }}" method="POST" enctype="multipart/form-data">
    @csrf
    <input type="file" name="file">
    <button type="submit">上传文件</button>
</form>

3.2 创建路由

在 routes/web.php 中定义路由:

use Illuminate\Support\Facades\Route;

Route::post('/file/upload', [FileController::class, 'upload'])->name('file.upload');

3.3 创建控制器

创建一个控制器来处理文件上传:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;

class FileController extends Controller
{
    public function upload(Request $request)
    {
        // 验证文件
        $request->validate([
            'file' => 'required|mimes:jpg,png,pdf|max:2048',
        ]);

        // 存储文件
        if ($request->hasFile('file')) {
            $path = $request->file('file')->store('uploads', 'public');

            return response()->json([
                'message' => '文件上传成功',
                'path' => $path
            ]);
        }

        return response()->json([
            'message' => '文件上传失败'
        ], 400);
    }
}

在上述代码中,store 方法用于将文件存储到指定的磁盘和目录。第一个参数是存储的目录,第二个参数是磁盘名称。

4. 文件下载

如果你需要让用户下载存储的文件,可以使用以下代码:

use Illuminate\Support\Facades\Storage;

public function download($filename)
{
    $path = 'uploads/'.$filename;
    if (Storage::disk('public')->exists($path)) {
        return Storage::disk('public')->download($path);
    }

    return response()->json([
        'message' => '文件不存在'
    ], 404);
}

5. 文件读取

读取文件内容可以使用 get 方法:

$contents = Storage::disk('public')->get('uploads/filename.jpg');

6. 文件删除

删除文件可以使用 delete 方法:

if (Storage::disk('public')->exists('uploads/filename.jpg')) {
    Storage::disk('public')->delete('uploads/filename.jpg');
}

7. 使用其他存储驱动

如果你要使用 Amazon S3 等其他存储驱动,需要安装相应的扩展包并配置环境变量。

7.1 安装扩展包

composer require league/flysystem-aws-s3-v3

7.2 配置环境变量

在 .env 文件中添加以下配置:

AWS_ACCESS_KEY_ID=your-key
AWS_SECRET_ACCESS_KEY=your-secret
AWS_DEFAULT_REGION=your-region
AWS_BUCKET=your-bucket
 

7.3 使用 S3 存储

if ($request->hasFile('file')) {
    $path = $request->file('file')->store('uploads', 's3');
}

以上就是 Laravel 文件存储的基本教程,你可以根据自己的需求进行扩展和调整。

使用 Ctrl+D 可将网站添加到书签
收藏网站
扫描二维码
关注早实习微信公众号
官方公众号
Top