重新实现filesystem模块,升级到最新版本;

This commit is contained in:
2023-09-19 15:21:40 +08:00
parent 9e2aa46cea
commit 37bbd99861
11 changed files with 562 additions and 127 deletions

View File

@@ -69,6 +69,7 @@ class Ajax extends AdminController
$result = $upload_service->save($data['file']);
} catch (\Exception $e) {
throw $e;
$this->error($e->getMessage());
}

View File

@@ -51,7 +51,7 @@
<label class="layui-form-label required">数据中心</label>
<div class="layui-input-block">
<input type="text" name="alioss_endpoint" class="layui-input" lay-verify="required" lay-reqtext="请输入数据中心" placeholder="请输入数据中心" value="{:sysconfig('upload','alioss_endpoint')}">
<tip>例子:https://oss-cn-shenzhen.aliyuncs.com</tip>
<tip>endpoint例子oss-cn-shenzhen.aliyuncs.com</tip>
</div>
</div>
@@ -67,7 +67,7 @@
<label class="layui-form-label required">访问域名</label>
<div class="layui-input-block">
<input type="text" name="alioss_domain" class="layui-input" lay-verify="required" lay-reqtext="请输入访问域名" placeholder="请输入访问域名" value="{:sysconfig('upload','alioss_domain')}">
<tip>例子ulthon-admin.oss-cn-shenzhen.aliyuncs.com</tip>
<tip>例子:http://ulthon-admin.oss-cn-shenzhen.aliyuncs.com</tip>
</div>
</div>
@@ -106,7 +106,7 @@
<label class="layui-form-label required">存储桶名称</label>
<div class="layui-input-block">
<input type="text" name="txcos_bucket" class="layui-input" lay-verify="required" lay-reqtext="请输入存储桶名称" placeholder="请输入存储桶名称" value="{:sysconfig('upload','txcos_bucket')}">
<tip>例子ulthon-admin-1251997243</tip>
<tip>例子ulthon-admin ,注意不需要拼接appid等数字</tip>
</div>
</div>
<div class="layui-form-item show-type-item txcos">

View File

@@ -15,4 +15,6 @@ $middleware_common = include_once __DIR__ . '/common/app/middleware.php';
$middleware = array_merge($middleware_default, $middleware_common);
return ksort($middleware);
ksort($middleware);
return $middleware;

View File

@@ -11,4 +11,6 @@ $service_common = include_once __DIR__ . '/common/app/service.php';
$service = array_merge($service_default, $service_common);
return ksort($service);
ksort($service);
return $service;

View File

@@ -24,14 +24,14 @@
"topthink/think-multi-app": "^1.0",
"topthink/think-view": "^2.0",
"topthink/think-captcha": "^3.0",
"topthink/think-filesystem": "^2.0",
"topthink/think-migration": "^3.0",
"guzzlehttp/guzzle": "^7.4",
"phpoffice/phpspreadsheet": "^1.22",
"doctrine/annotations": "^1.13",
"overtrue/flysystem-qiniu": "^2.0",
"overtrue/flysystem-cos": "^4.0",
"iidestiny/flysystem-oss": "^3.0"
"league/flysystem": "^3.0",
"overtrue/flysystem-qiniu": "^3.0",
"overtrue/flysystem-cos": "^5.0",
"iidestiny/flysystem-oss": "^4.0"
},
"require-dev": {
"symfony/var-dumper": "^4.2"

311
composer.lock generated
View File

@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "ca3fcd696a06edb2905bbd88a2d905d0",
"content-hash": "07cbcad2506a74dbd4130f9597859332",
"packages": [
{
"name": "aliyuncs/oss-sdk-php",
@@ -640,16 +640,16 @@
},
{
"name": "iidestiny/flysystem-oss",
"version": "3.1",
"version": "4.3",
"source": {
"type": "git",
"url": "https://github.com/iiDestiny/flysystem-oss.git",
"reference": "9fff308b9bcb47f7d5021c0741a8fbcf463cef9e"
"reference": "15447c3367cb8a36a64bc2881c13ee2b6ae3fa26"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/iiDestiny/flysystem-oss/zipball/9fff308b9bcb47f7d5021c0741a8fbcf463cef9e",
"reference": "9fff308b9bcb47f7d5021c0741a8fbcf463cef9e",
"url": "https://api.github.com/repos/iiDestiny/flysystem-oss/zipball/15447c3367cb8a36a64bc2881c13ee2b6ae3fa26",
"reference": "15447c3367cb8a36a64bc2881c13ee2b6ae3fa26",
"shasum": ""
},
"require": {
@@ -657,12 +657,12 @@
"ext-curl": "*",
"ext-json": "*",
"ext-openssl": "*",
"league/flysystem": "^2.0",
"php": ">=7.2"
"league/flysystem": "^3.0",
"php": "^8.0.2"
},
"require-dev": {
"mockery/mockery": "^1.2",
"phpunit/phpunit": "^6.5",
"mockery/mockery": "^1.5",
"phpunit/phpunit": "^9.5",
"symfony/var-dumper": "^3.4"
},
"type": "library",
@@ -690,45 +690,53 @@
],
"support": {
"issues": "https://github.com/iiDestiny/flysystem-oss/issues",
"source": "https://github.com/iiDestiny/flysystem-oss/tree/3.1"
"source": "https://github.com/iiDestiny/flysystem-oss/tree/4.3"
},
"time": "2022-04-19T05:39:46+00:00"
"time": "2023-09-09T11:59:47+00:00"
},
{
"name": "league/flysystem",
"version": "2.5.0",
"version": "3.16.0",
"source": {
"type": "git",
"url": "https://github.com/thephpleague/flysystem.git",
"reference": "8aaffb653c5777781b0f7f69a5d937baf7ab6cdb"
"reference": "4fdf372ca6b63c6e281b1c01a624349ccb757729"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/thephpleague/flysystem/zipball/8aaffb653c5777781b0f7f69a5d937baf7ab6cdb",
"reference": "8aaffb653c5777781b0f7f69a5d937baf7ab6cdb",
"url": "https://api.github.com/repos/thephpleague/flysystem/zipball/4fdf372ca6b63c6e281b1c01a624349ccb757729",
"reference": "4fdf372ca6b63c6e281b1c01a624349ccb757729",
"shasum": ""
},
"require": {
"ext-json": "*",
"league/flysystem-local": "^3.0.0",
"league/mime-type-detection": "^1.0.0",
"php": "^7.2 || ^8.0"
"php": "^8.0.2"
},
"conflict": {
"guzzlehttp/ringphp": "<1.1.1"
"async-aws/core": "<1.19.0",
"async-aws/s3": "<1.14.0",
"aws/aws-sdk-php": "3.209.31 || 3.210.0",
"guzzlehttp/guzzle": "<7.0",
"guzzlehttp/ringphp": "<1.1.1",
"phpseclib/phpseclib": "3.0.15",
"symfony/http-client": "<5.2"
},
"require-dev": {
"async-aws/s3": "^1.5",
"async-aws/simple-s3": "^1.0",
"aws/aws-sdk-php": "^3.132.4",
"async-aws/simple-s3": "^1.1",
"aws/aws-sdk-php": "^3.220.0",
"composer/semver": "^3.0",
"ext-fileinfo": "*",
"ext-ftp": "*",
"friendsofphp/php-cs-fixer": "^3.2",
"ext-zip": "*",
"friendsofphp/php-cs-fixer": "^3.5",
"google/cloud-storage": "^1.23",
"phpseclib/phpseclib": "^2.0",
"microsoft/azure-storage-blob": "^1.1",
"phpseclib/phpseclib": "^3.0.14",
"phpstan/phpstan": "^0.12.26",
"phpunit/phpunit": "^8.5 || ^9.4",
"sabre/dav": "^4.1"
"phpunit/phpunit": "^9.5.11|^10.0",
"sabre/dav": "^4.3.1"
},
"type": "library",
"autoload": {
@@ -762,7 +770,7 @@
],
"support": {
"issues": "https://github.com/thephpleague/flysystem/issues",
"source": "https://github.com/thephpleague/flysystem/tree/2.5.0"
"source": "https://github.com/thephpleague/flysystem/tree/3.16.0"
},
"funding": [
{
@@ -772,13 +780,69 @@
{
"url": "https://github.com/frankdejonge",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/league/flysystem",
"type": "tidelift"
}
],
"time": "2022-09-17T21:02:32+00:00"
"time": "2023-09-07T19:22:17+00:00"
},
{
"name": "league/flysystem-local",
"version": "3.16.0",
"source": {
"type": "git",
"url": "https://github.com/thephpleague/flysystem-local.git",
"reference": "ec7383f25642e6fd4bb0c9554fc2311245391781"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/ec7383f25642e6fd4bb0c9554fc2311245391781",
"reference": "ec7383f25642e6fd4bb0c9554fc2311245391781",
"shasum": ""
},
"require": {
"ext-fileinfo": "*",
"league/flysystem": "^3.0.0",
"league/mime-type-detection": "^1.0.0",
"php": "^8.0.2"
},
"type": "library",
"autoload": {
"psr-4": {
"League\\Flysystem\\Local\\": ""
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Frank de Jonge",
"email": "info@frankdejonge.nl"
}
],
"description": "Local filesystem adapter for Flysystem.",
"keywords": [
"Flysystem",
"file",
"files",
"filesystem",
"local"
],
"support": {
"issues": "https://github.com/thephpleague/flysystem-local/issues",
"source": "https://github.com/thephpleague/flysystem-local/tree/3.16.0"
},
"funding": [
{
"url": "https://ecologi.com/frankdejonge",
"type": "custom"
},
{
"url": "https://github.com/frankdejonge",
"type": "github"
}
],
"time": "2023-08-30T10:23:59+00:00"
},
{
"name": "league/mime-type-detection",
@@ -1086,35 +1150,36 @@
},
{
"name": "overtrue/flysystem-cos",
"version": "4.0.1",
"version": "5.1.4",
"source": {
"type": "git",
"url": "https://github.com/overtrue/flysystem-cos.git",
"reference": "d86e1d5f3f7a881c672a698fbdfa08a767b3ea38"
"reference": "bbcfe9195e96a9d5262c79fdb1e57820d45dd664"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/overtrue/flysystem-cos/zipball/d86e1d5f3f7a881c672a698fbdfa08a767b3ea38",
"reference": "d86e1d5f3f7a881c672a698fbdfa08a767b3ea38",
"url": "https://api.github.com/repos/overtrue/flysystem-cos/zipball/bbcfe9195e96a9d5262c79fdb1e57820d45dd664",
"reference": "bbcfe9195e96a9d5262c79fdb1e57820d45dd664",
"shasum": ""
},
"require": {
"league/flysystem": "^2.0",
"overtrue/qcloud-cos-client": "^1.0.0",
"php": ">=7.4"
"league/flysystem": "^3.0",
"overtrue/qcloud-cos-client": "^2.0",
"php": ">=8.0.2"
},
"require-dev": {
"brainmaestro/composer-git-hooks": "^2.7",
"friendsofphp/php-cs-fixer": "^2.15",
"mockery/mockery": "~1.0",
"phpunit/phpunit": "~9"
"brainmaestro/composer-git-hooks": "dev-master",
"laravel/pint": "^1.6",
"league/flysystem-adapter-test-utilities": "^3.0",
"mockery/mockery": "^1.0",
"phpunit/phpunit": "^9.5"
},
"type": "library",
"extra": {
"hooks": {
"pre-commit": [
"composer test",
"composer check-style"
"composer fix-style",
"composer test"
],
"pre-push": [
"composer test",
@@ -1140,7 +1205,7 @@
"description": "Flysystem adapter for the QCloud COS storage.",
"support": {
"issues": "https://github.com/overtrue/flysystem-cos/issues",
"source": "https://github.com/overtrue/flysystem-cos/tree/4.0.1"
"source": "https://github.com/overtrue/flysystem-cos/tree/5.1.4"
},
"funding": [
{
@@ -1148,32 +1213,43 @@
"type": "github"
}
],
"time": "2021-11-10T09:20:45+00:00"
"time": "2023-05-26T09:00:43+00:00"
},
{
"name": "overtrue/flysystem-qiniu",
"version": "2.0.1",
"version": "3.2.2",
"source": {
"type": "git",
"url": "https://github.com/overtrue/flysystem-qiniu.git",
"reference": "8d997760cff8967d9d6861d359c404f8ec6aa316"
"reference": "cf87e0fd74ba80736c7e0e9d19e1422eee6617d2"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/overtrue/flysystem-qiniu/zipball/8d997760cff8967d9d6861d359c404f8ec6aa316",
"reference": "8d997760cff8967d9d6861d359c404f8ec6aa316",
"url": "https://api.github.com/repos/overtrue/flysystem-qiniu/zipball/cf87e0fd74ba80736c7e0e9d19e1422eee6617d2",
"reference": "cf87e0fd74ba80736c7e0e9d19e1422eee6617d2",
"shasum": ""
},
"require": {
"league/flysystem": "^2.0",
"php": ">=7.2",
"league/flysystem": "^3.0",
"qiniu/php-sdk": "^7.2"
},
"require-dev": {
"mockery/mockery": "1.3.1",
"phpunit/phpunit": "~8.0"
"mockery/mockery": "^1.4",
"phpunit/phpunit": "^9.5"
},
"type": "library",
"extra": {
"hooks": {
"pre-commit": [
"composer test",
"composer check-style"
],
"pre-push": [
"composer test",
"composer check-style"
]
}
},
"autoload": {
"psr-4": {
"Overtrue\\Flysystem\\Qiniu\\": "src"
@@ -1192,7 +1268,7 @@
"description": "Flysystem adapter for the Qiniu storage.",
"support": {
"issues": "https://github.com/overtrue/flysystem-qiniu/issues",
"source": "https://github.com/overtrue/flysystem-qiniu/tree/2.0.1"
"source": "https://github.com/overtrue/flysystem-qiniu/tree/3.2.2"
},
"funding": [
{
@@ -1200,20 +1276,20 @@
"type": "github"
}
],
"time": "2022-08-12T03:23:12+00:00"
"time": "2023-05-02T13:14:45+00:00"
},
{
"name": "overtrue/qcloud-cos-client",
"version": "1.0.4",
"version": "2.0.2",
"source": {
"type": "git",
"url": "https://github.com/overtrue/qcloud-cos-client.git",
"reference": "64ca47881afe4fd0961958f85674dcae71421913"
"reference": "238ef94beb0f856336e3cedd93b21c1c42228540"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/overtrue/qcloud-cos-client/zipball/64ca47881afe4fd0961958f85674dcae71421913",
"reference": "64ca47881afe4fd0961958f85674dcae71421913",
"url": "https://api.github.com/repos/overtrue/qcloud-cos-client/zipball/238ef94beb0f856336e3cedd93b21c1c42228540",
"reference": "238ef94beb0f856336e3cedd93b21c1c42228540",
"shasum": ""
},
"require": {
@@ -1221,16 +1297,18 @@
"ext-json": "*",
"ext-libxml": "*",
"ext-simplexml": "*",
"guzzlehttp/guzzle": "^7.2",
"php": ">=7.4",
"psr/http-message": "^1.0"
"guzzlehttp/guzzle": "^7.4",
"php": ">=8.0.2",
"psr/http-message": "^1.0|^2.0",
"thenorthmemory/xml": "^1.0"
},
"require-dev": {
"brainmaestro/composer-git-hooks": "^2.7",
"friendsofphp/php-cs-fixer": "^3.4.0",
"brainmaestro/composer-git-hooks": "^2.8",
"friendsofphp/php-cs-fixer": "^3.5",
"laravel/pint": "^1.2",
"mockery/mockery": "^1.0",
"monolog/monolog": "^2.1",
"phpunit/phpunit": "^9.0"
"monolog/monolog": "^2.5",
"phpunit/phpunit": "^9.5"
},
"type": "library",
"extra": {
@@ -1263,7 +1341,7 @@
"description": "Client of QCloud.com COS",
"support": {
"issues": "https://github.com/overtrue/qcloud-cos-client/issues",
"source": "https://github.com/overtrue/qcloud-cos-client/tree/1.0.4"
"source": "https://github.com/overtrue/qcloud-cos-client/tree/2.0.2"
},
"funding": [
{
@@ -1271,7 +1349,7 @@
"type": "github"
}
],
"time": "2022-11-07T00:18:25+00:00"
"time": "2023-08-16T08:56:32+00:00"
},
{
"name": "phpoffice/phpspreadsheet",
@@ -1910,6 +1988,57 @@
],
"time": "2022-01-02T09:55:41+00:00"
},
{
"name": "thenorthmemory/xml",
"version": "1.1.1",
"source": {
"type": "git",
"url": "https://github.com/TheNorthMemory/xml.git",
"reference": "6f50c63450a0b098772423f8bdc3c4ad2c4c30bb"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/TheNorthMemory/xml/zipball/6f50c63450a0b098772423f8bdc3c4ad2c4c30bb",
"reference": "6f50c63450a0b098772423f8bdc3c4ad2c4c30bb",
"shasum": ""
},
"require": {
"ext-libxml": "*",
"ext-simplexml": "*",
"php": ">=7.1.2"
},
"require-dev": {
"phpstan/phpstan": "^0.12.89 || ^1.0",
"phpunit/phpunit": "^7.5 || ^8.5.16 || ^9.3.5"
},
"type": "library",
"autoload": {
"psr-4": {
"TheNorthMemory\\Xml\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"Apache-2.0"
],
"authors": [
{
"name": "James ZHANG",
"homepage": "https://github.com/TheNorthMemory"
}
],
"description": "A wrapper of the XML parser and builder",
"homepage": "https://github.com/TheNorthMemory/xml",
"keywords": [
"xml-builder",
"xml-parser"
],
"support": {
"issues": "https://github.com/TheNorthMemory/xml/issues",
"source": "https://github.com/TheNorthMemory/xml/tree/1.1.1"
},
"time": "2023-01-15T06:01:13+00:00"
},
{
"name": "topthink/framework",
"version": "v8.0.2",
@@ -2028,52 +2157,6 @@
},
"time": "2023-04-27T07:18:40+00:00"
},
{
"name": "topthink/think-filesystem",
"version": "v2.0.2",
"source": {
"type": "git",
"url": "https://github.com/top-think/think-filesystem.git",
"reference": "c08503232fcae0c3c7fefae5e6b5c841ffe09f2f"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/top-think/think-filesystem/zipball/c08503232fcae0c3c7fefae5e6b5c841ffe09f2f",
"reference": "c08503232fcae0c3c7fefae5e6b5c841ffe09f2f",
"shasum": ""
},
"require": {
"league/flysystem": "^2.0",
"topthink/framework": "^6.1|^8.0"
},
"require-dev": {
"mikey179/vfsstream": "^1.6",
"mockery/mockery": "^1.2",
"phpunit/phpunit": "^8.0"
},
"type": "library",
"autoload": {
"psr-4": {
"think\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"Apache-2.0"
],
"authors": [
{
"name": "yunwuxin",
"email": "448901948@qq.com"
}
],
"description": "The ThinkPHP6.1 Filesystem Package",
"support": {
"issues": "https://github.com/top-think/think-filesystem/issues",
"source": "https://github.com/top-think/think-filesystem/tree/v2.0.2"
},
"time": "2023-02-08T01:23:42+00:00"
},
{
"name": "topthink/think-helper",
"version": "v3.1.6",

View File

@@ -0,0 +1,89 @@
<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006~2021 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: yunwuxin <448901948@qq.com>
// +----------------------------------------------------------------------
declare (strict_types = 1);
namespace think;
use InvalidArgumentException;
use think\filesystem\Driver;
use think\filesystem\driver\Local;
use think\helper\Arr;
/**
* Class Filesystem
* @package think
* @mixin Driver
* @mixin Local
*/
class Filesystem extends Manager
{
protected $namespace = '\\think\\filesystem\\driver\\';
/**
* @param null|string $name
* @return Driver
*/
public function disk(string $name = null): Driver
{
return $this->driver($name);
}
protected function resolveType(string $name)
{
return $this->getDiskConfig($name, 'type', 'local');
}
protected function resolveConfig(string $name)
{
return $this->getDiskConfig($name);
}
/**
* 获取缓存配置
* @access public
* @param null|string $name 名称
* @param mixed $default 默认值
* @return mixed
*/
public function getConfig(string $name = null, $default = null)
{
if (!is_null($name)) {
return $this->app->config->get('filesystem.' . $name, $default);
}
return $this->app->config->get('filesystem');
}
/**
* 获取磁盘配置
* @param string $disk
* @param null $name
* @param null $default
* @return array
*/
public function getDiskConfig($disk, $name = null, $default = null)
{
if ($config = $this->getConfig("disks.{$disk}")) {
return Arr::get($config, $name, $default);
}
throw new InvalidArgumentException("Disk [$disk] not found.");
}
/**
* 默认驱动
* @return string|null
*/
public function getDefaultDriver()
{
return $this->getConfig('default');
}
}

View File

@@ -0,0 +1,33 @@
<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006~2021 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: yunwuxin <448901948@qq.com>
// +----------------------------------------------------------------------
declare (strict_types = 1);
namespace think\facade;
use think\Facade;
use think\filesystem\Driver;
/**
* Class Filesystem
* @package think\facade
* @mixin \think\Filesystem
* @method static Driver disk(string $name = null) , null|string
* @method static mixed getConfig(null|string $name = null, mixed $default = null) 获取缓存配置
* @method static array getDiskConfig(string $disk, null $name = null, null $default = null) 获取磁盘配置
* @method static string|null getDefaultDriver() 默认驱动
*/
class Filesystem extends Facade
{
protected static function getFacadeClass()
{
return \think\Filesystem::class;
}
}

View File

@@ -0,0 +1,130 @@
<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006~2021 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: yunwuxin <448901948@qq.com>
// +----------------------------------------------------------------------
declare (strict_types = 1);
namespace think\filesystem;
use League\Flysystem\Filesystem;
use League\Flysystem\FilesystemAdapter;
use League\Flysystem\UnableToSetVisibility;
use League\Flysystem\UnableToWriteFile;
use RuntimeException;
use think\Cache;
use think\File;
/**
* Class Driver
* @package think\filesystem
* @mixin Filesystem
*/
abstract class Driver
{
/** @var Cache */
protected $cache;
/** @var Filesystem */
protected $filesystem;
/**
* 配置参数
* @var array
*/
protected $config = [];
public function __construct(Cache $cache, array $config)
{
$this->cache = $cache;
$this->config = array_merge($this->config, $config);
$adapter = $this->createAdapter();
$this->filesystem = $this->createFilesystem($adapter);
}
abstract protected function createAdapter(): FilesystemAdapter;
protected function createFilesystem(FilesystemAdapter $adapter): Filesystem
{
$config = array_intersect_key($this->config, array_flip(['visibility', 'disable_asserts', 'url']));
return new Filesystem($adapter, $config);
}
/**
* 获取文件完整路径
* @param string $path
* @return string
*/
public function path(string $path): string
{
return $path;
}
protected function concatPathToUrl($url, $path)
{
return rtrim($url, '/') . '/' . ltrim($path, '/');
}
public function url(string $path): string
{
throw new RuntimeException('This driver does not support retrieving URLs.');
}
/**
* 保存文件
* @param string $path 路径
* @param File $file 文件
* @param null|string|\Closure $rule 文件名规则
* @param array $options 参数
* @return bool|string
*/
public function putFile(string $path, File $file, $rule = null, array $options = [])
{
return $this->putFileAs($path, $file, $file->hashName($rule), $options);
}
/**
* 指定文件名保存文件
* @param string $path 路径
* @param File $file 文件
* @param string $name 文件名
* @param array $options 参数
* @return bool|string
*/
public function putFileAs(string $path, File $file, string $name, array $options = [])
{
$stream = fopen($file->getRealPath(), 'r');
$path = trim($path . '/' . $name, '/');
$result = $this->put($path, $stream, $options);
if (is_resource($stream)) {
fclose($stream);
}
return $result ? $path : false;
}
protected function put(string $path, $contents, array $options = [])
{
try {
$this->writeStream($path, $contents, $options);
} catch (UnableToWriteFile|UnableToSetVisibility $e) {
return false;
}
return true;
}
public function __call($method, $parameters)
{
return $this->filesystem->$method(...$parameters);
}
}

View File

@@ -0,0 +1,98 @@
<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006~2021 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: yunwuxin <448901948@qq.com>
// +----------------------------------------------------------------------
declare (strict_types = 1);
namespace think\filesystem\driver;
use League\Flysystem\FilesystemAdapter;
use League\Flysystem\Local\LocalFilesystemAdapter;
use League\Flysystem\PathNormalizer;
use League\Flysystem\PathPrefixer;
use League\Flysystem\UnixVisibility\PortableVisibilityConverter;
use League\Flysystem\Visibility;
use League\Flysystem\WhitespacePathNormalizer;
use think\filesystem\Driver;
class Local extends Driver
{
/**
* 配置参数
* @var array
*/
protected $config = [
'root' => '',
];
/**
* @var PathPrefixer
*/
protected $prefixer;
/**
* @var PathNormalizer
*/
protected $normalizer;
protected function createAdapter(): FilesystemAdapter
{
$visibility = PortableVisibilityConverter::fromArray(
$this->config['permissions'] ?? [],
$this->config['visibility'] ?? Visibility::PRIVATE
);
$links = ($this->config['links'] ?? null) === 'skip'
? LocalFilesystemAdapter::SKIP_LINKS
: LocalFilesystemAdapter::DISALLOW_LINKS;
return new LocalFilesystemAdapter(
$this->config['root'],
$visibility,
$this->config['lock'] ?? LOCK_EX,
$links
);
}
protected function prefixer()
{
if (!$this->prefixer) {
$this->prefixer = new PathPrefixer($this->config['root'], DIRECTORY_SEPARATOR);
}
return $this->prefixer;
}
protected function normalizer()
{
if (!$this->normalizer) {
$this->normalizer = new WhitespacePathNormalizer();
}
return $this->normalizer;
}
/**
* 获取文件访问地址
* @param string $path 文件路径
* @return string
*/
public function url(string $path): string
{
$path = $this->normalizer()->normalizePath($path);
if (isset($this->config['url'])) {
return $this->concatPathToUrl($this->config['url'], $path);
}
return parent::url($path);
}
public function path(string $path): string
{
return $this->prefixer()->prefixPath($path);
}
}

View File

@@ -26,10 +26,7 @@ class Txcos extends Driver
'bucket' => $bucket,
// 可选,如果 bucket 为私有访问请打开此项
'signed_url' => false,
// 可选,是否使用 https默认 false
'use_https' => true,
'signed_url' => false
];
$adapter = new CosAdapter($config);