动态添加 Laravel 存储磁盘/文件系统

Doe*_*rth 9 filesystems storage laravel

我在一个数据库表中保留了多个 FTP 帐户,并且希望每个帐户都可以用作 Laravel 中的存储磁盘。

通常,Laravel 的磁盘定义在config/filesystems.php. 但不是在那里硬编码我的 FTP 帐户,我想动态定义它们(在中间件中)。

这可能吗?我如何做到这一点?

cro*_*e2u 11

Laravel 的 FilesystemManager 具有创建最常见磁盘的方法。

<?php
use Illuminate\Filesystem\FilesystemManager;
$fsMgr = new FilesystemManager(app());
// local disk
$localDisk = $fsMgr->createLocalDriver(['root' => "/path/to/root"]);
// FTP disk
$ftpDisk = $fsMgr->createFtpDriver([/* FTP options */]);
// SFTP disk
$sftpDisk = $fsMgr->createSftpDriver([/* SFTP options */]);
// S3 disk
$s3Disk = $fsMgr->createS3Driver([/* S3 options */]);
Run Code Online (Sandbox Code Playgroud)

除此之外,你可以创建你的 league/flysystem 安装支持的任何文件系统,你只需要把它包装在 Illuminate\Filesystem\FilesystemAdapter 中:

<?php
use League\Flysystem\FilesystemInterface;
// create any Flysystem instance and wrap it in Laravel's adapter
$myDisk = new FilesystemAdapter(/* \League\Flysystem\FilesystemInterface */ $filesystem);
Run Code Online (Sandbox Code Playgroud)

通过这种方式,您可以即时创建磁盘,无需修改应用程序配置,如果您有大量连接,例如与合作伙伴的 FTP/SFTP 服务器、GCloud 或 S3 存储桶的连接,这会很方便。


kir*_*ti9 6

创建新的服务提供商 php artisan make:provider FileSystemServiceProvider

如果config/app.php 您打开config/app.phpLaravel 附带的文件,您将看到一个provider's array. 在那里注册创建的服务提供者。

The Boot Method创建的服务提供程序中使用下面提到的代码来注册磁盘假设fileSystemsDetails是型号名称

public function boot() {
    DomainSettings::all()->each(function(DomainSettings $myDisk) {

        if (!is_null($myDisk->driver_name) && !is_null($myDisk->driver_type)
            && !is_null($myDisk->driver_host) && !is_null($myDisk->driver_username) && !is_null($myDisk->driver_password)) {

            $this->app['config']["filesystems.disks.{$myDisk->driver_name}"] =
                [   'driver' => $myDisk->driver_type,
                    'host' => $myDisk->driver_host,
                    'username' => $myDisk->driver_username,
                    'password' => $myDisk->driver_password,
                    'root' => $myDisk->driver_root,
                ];
        }
    });
}
Run Code Online (Sandbox Code Playgroud)


Doe*_*rth 5

MyDiskServiceProdiver用这种方法创建了一个服务提供者:

public function boot()
{
    MyDisk::all()->each(function(MyDisk $myDisk) {
        $this->app['config']["filesystems.disks.{$myDisk->name}"] = ['driver' => $myDisk->driver] + $myDisk->config;
    });
}
Run Code Online (Sandbox Code Playgroud)

config属性的类型为JSON的数据库,并拥有多项驱动程序特定的属性。


小智 -2

您可以将 FTP 帐户配置存储在项目中的 csv 文件中,然后使用 laravel 中的 core php 将每个帐户用作存储磁盘。您有一些想法可以从此链接上传文件: https: //cloudinary.com/blog/file_upload_with_php

在这个 $currentDir = getcwd(); $uploadDirectory = "/上传/"; 您可以从 CSV 文件中获取这两个文件。也许这可以在实现正确的逻辑后帮助您。