From aed749a86d1893a76932557ac816bddcec1690fc Mon Sep 17 00:00:00 2001 From: Wisp X Date: Sat, 5 Mar 2022 13:08:53 +0800 Subject: [PATCH] =?UTF-8?q?:sparkles:=20=E5=AE=8C=E6=88=90=20ftp=20?= =?UTF-8?q?=E5=82=A8=E5=AD=98=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Enums/Strategy/FtpOption.php | 30 ++++++++++++++ .../Controllers/Admin/StrategyController.php | 4 +- app/Http/Requests/Admin/StrategyRequest.php | 24 +++++++++-- app/Services/ImageService.php | 36 ++++++++++++----- resources/views/admin/strategy/add.blade.php | 38 ++++++++++++++++++ resources/views/admin/strategy/edit.blade.php | 40 +++++++++++++++++++ 6 files changed, 157 insertions(+), 15 deletions(-) create mode 100644 app/Enums/Strategy/FtpOption.php diff --git a/app/Enums/Strategy/FtpOption.php b/app/Enums/Strategy/FtpOption.php new file mode 100644 index 00000000..22e4481b --- /dev/null +++ b/app/Enums/Strategy/FtpOption.php @@ -0,0 +1,30 @@ +save(); - $strategy->groups()->attach($validated['groups']); + $strategy->groups()->attach($validated['groups'] ?? []); }); return $this->success('创建成功'); } @@ -52,7 +52,7 @@ class StrategyController extends Controller $strategy->fill($request->validated()); DB::transaction(function () use ($strategy, $validated) { $strategy->save(); - $strategy->groups()->sync($validated['groups']); + $strategy->groups()->sync($validated['groups'] ?? []); }); return $this->success('保存成功'); } diff --git a/app/Http/Requests/Admin/StrategyRequest.php b/app/Http/Requests/Admin/StrategyRequest.php index 7463712a..a1834deb 100644 --- a/app/Http/Requests/Admin/StrategyRequest.php +++ b/app/Http/Requests/Admin/StrategyRequest.php @@ -90,7 +90,16 @@ class StrategyRequest extends FormRequest 'configs.password' => 'required_if:configs.private_key,null', 'configs.private_key' => 'required_if:configs.password,null', 'configs.passphrase' => '', - 'configs.use_agent' => 'boolean', + 'configs.use_agent' => 'required|boolean', + ], + StrategyKey::Ftp => [ + 'configs.root' => 'required', + 'configs.host' => 'required', + 'configs.port' => 'integer', + 'configs.username' => 'required', + 'configs.password' => 'required', + 'configs.ssl' => 'required|boolean', + 'configs.passive' => 'required|boolean', ], }); } @@ -106,7 +115,7 @@ class StrategyRequest extends FormRequest return array_merge($array, match((int)$this->input('key')) { StrategyKey::Local => [ - 'configs.root' => '储存路径', + 'configs.root' => '根目录路径', ], StrategyKey::Cos => [ 'configs.app_id' => 'AppId', @@ -121,7 +130,7 @@ class StrategyRequest extends FormRequest 'configs.bucket' => 'Bucket', ], StrategyKey::Sftp => [ - 'configs.root' => '储存路径', + 'configs.root' => '根目录路径', 'configs.host' => '主机地址', 'configs.port' => '连接端口', 'configs.username' => '用户名', @@ -130,6 +139,15 @@ class StrategyRequest extends FormRequest 'configs.passphrase' => '密钥口令', 'configs.use_agent' => '使用代理', ], + StrategyKey::Ftp => [ + 'configs.root' => '根目录路径', + 'configs.host' => '主机地址', + 'configs.port' => '连接端口', + 'configs.username' => '用户名', + 'configs.password' => '密码', + 'configs.ssl' => '加密连接', + 'configs.passive' => '被动模式', + ], }); } } diff --git a/app/Services/ImageService.php b/app/Services/ImageService.php index fa0aa88e..a3d270df 100644 --- a/app/Services/ImageService.php +++ b/app/Services/ImageService.php @@ -9,6 +9,7 @@ use App\Enums\GroupConfigKey; use App\Enums\ImagePermission; use App\Enums\Scan\AliyunOption; use App\Enums\Strategy\CosOption; +use App\Enums\Strategy\FtpOption; use App\Enums\Strategy\KodoOption; use App\Enums\Strategy\SftpOption; use App\Enums\StrategyKey; @@ -37,6 +38,8 @@ use Intervention\Image\ImageManager; use League\Flysystem\Filesystem; use League\Flysystem\FilesystemAdapter; use League\Flysystem\FilesystemException; +use League\Flysystem\Ftp\FtpAdapter; +use League\Flysystem\Ftp\FtpConnectionOptions; use League\Flysystem\Local\LocalFilesystemAdapter; use League\Flysystem\PhpseclibV2\SftpAdapter; use League\Flysystem\PhpseclibV2\SftpConnectionProvider; @@ -217,15 +220,16 @@ class ImageService bucket: $configs->get(KodoOption::Bucket), domain: $configs->get(KodoOption::Url), ), - StrategyKey::Sftp => new SftpAdapter(new SftpConnectionProvider( - host: $configs->get(SftpOption::Host), - username: $configs->get(SftpOption::Username), - password: $configs->get(SftpOption::Password), - privateKey: $configs->get(SftpOption::PrivateKey), - passphrase: (string)$configs->get(SftpOption::Passphrase), - port: $configs->get(SftpOption::Port), - useAgent: (bool)$configs->get(SftpOption::UseAgent) - ), + StrategyKey::Sftp => new SftpAdapter( + connectionProvider: new SftpConnectionProvider( + host: $configs->get(SftpOption::Host), + username: $configs->get(SftpOption::Username), + password: $configs->get(SftpOption::Password), + privateKey: $configs->get(SftpOption::PrivateKey), + passphrase: (string)$configs->get(SftpOption::Passphrase), + port: (int)$configs->get(SftpOption::Port), + useAgent: (bool)$configs->get(SftpOption::UseAgent) + ), root: $configs->get(SftpOption::Root), visibilityConverter: PortableVisibilityConverter::fromArray([ 'file' => [ @@ -237,7 +241,19 @@ class ImageService 'private' => 7604, ], ]) - ) + ), + StrategyKey::Ftp => new FtpAdapter( + connectionOptions: FtpConnectionOptions::fromArray([ + 'host' => $configs->get(FtpOption::Host), + 'root' => $configs->get(FtpOption::Root), + 'port' => (int)$configs->get(FtpOption::Port), + 'ssl' => (bool)$configs->get(FtpOption::Ssl), + 'username' => $configs->get(FtpOption::Username), + 'password' => $configs->get(FtpOption::Password), + 'passive' => (bool)$configs->get(FtpOption::Passive), + 'timeout' => 30, + ]), + ), }; } diff --git a/resources/views/admin/strategy/add.blade.php b/resources/views/admin/strategy/add.blade.php index 690eb917..64ec7e26 100644 --- a/resources/views/admin/strategy/add.blade.php +++ b/resources/views/admin/strategy/add.blade.php @@ -141,6 +141,44 @@ + +
取消 diff --git a/resources/views/admin/strategy/edit.blade.php b/resources/views/admin/strategy/edit.blade.php index f0db5751..5fe63487 100644 --- a/resources/views/admin/strategy/edit.blade.php +++ b/resources/views/admin/strategy/edit.blade.php @@ -152,6 +152,46 @@
@endif + + @if($strategy->key === \App\Enums\StrategyKey::Ftp) +
+
+ + +
+
+
+ + +
+
+
+ + +
+
+ + + 通常情况下,FTP 的被动模式连接端口为 21,主动模式为 20 +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ @endif
取消