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 @@