// +---------------------------------------------------------------------- namespace ywxapp\utils\storage; use think\file\UploadedFile; /** * LocalStorage 类 * * @author ywxapp */ class LocalStorage implements StorageInterface { protected $config; public function __construct(array $config) { $this->config = $config; } /** * 解析存储根目录(支持绝对路径与相对 public 目录的相对路径) */ protected function getRoot(): string { $root = $this->config['root'] ?? 'storage'; // 绝对路径(Windows 盘符 或 Unix 根目录)直接使用,不再拼接 public_path if (preg_match('#^[a-zA-Z]:[\\\\/]|^/#', $root)) { return rtrim($root, '/\\'); } return rtrim(public_path() . ltrim($root, '/\\'), '/\\'); } public function upload(UploadedFile $file, string $path, array $options = []): array { // 移动文件到指定目录 $root = $this->getRoot(); $url = $this->config['url'] ?? '/storage'; $dir = $root . DIRECTORY_SEPARATOR . ltrim($path, '/\\'); if (! is_dir($dir)) { mkdir($dir, 0777, true); } $ext = $file->extension() ?: pathinfo($file->getOriginalName(), PATHINFO_EXTENSION); $savename = date('His') . '_' . uniqid() . '.' . $ext; $file->move($dir, $savename); $realName = $file->getSaveName() ?: $savename; $relative = ltrim($path, '/\\') . '/' . $realName; return [$realName, $relative, rtrim($url, '/') . '/' . $relative]; } public function delete(string $path): bool { $fullPath = $this->getRoot() . DIRECTORY_SEPARATOR . ltrim($path, '/\\'); return file_exists($fullPath) && unlink($fullPath); } public function getUrl(string $path): string { $domain = $this->config['domain'] ?? ''; return rtrim($domain, '/') . '/' . ltrim($path, '/'); } public function exists(string $path): bool { $fullPath = $this->getRoot() . DIRECTORY_SEPARATOR . ltrim($path, '/\\'); return file_exists($fullPath); } }