first commit
This commit is contained in:
141
vendor/laravel/framework/src/Illuminate/Filesystem/AwsS3V3Adapter.php
vendored
Normal file
141
vendor/laravel/framework/src/Illuminate/Filesystem/AwsS3V3Adapter.php
vendored
Normal file
@ -0,0 +1,141 @@
|
||||
<?php
|
||||
|
||||
namespace Illuminate\Filesystem;
|
||||
|
||||
use Aws\S3\S3Client;
|
||||
use Illuminate\Support\Traits\Conditionable;
|
||||
use League\Flysystem\AwsS3V3\AwsS3V3Adapter as S3Adapter;
|
||||
use League\Flysystem\FilesystemOperator;
|
||||
|
||||
class AwsS3V3Adapter extends FilesystemAdapter
|
||||
{
|
||||
use Conditionable;
|
||||
|
||||
/**
|
||||
* The AWS S3 client.
|
||||
*
|
||||
* @var \Aws\S3\S3Client
|
||||
*/
|
||||
protected $client;
|
||||
|
||||
/**
|
||||
* Create a new AwsS3V3FilesystemAdapter instance.
|
||||
*
|
||||
* @param \League\Flysystem\FilesystemOperator $driver
|
||||
* @param \League\Flysystem\AwsS3V3\AwsS3V3Adapter $adapter
|
||||
* @param array $config
|
||||
* @param \Aws\S3\S3Client $client
|
||||
* @return void
|
||||
*/
|
||||
public function __construct(FilesystemOperator $driver, S3Adapter $adapter, array $config, S3Client $client)
|
||||
{
|
||||
parent::__construct($driver, $adapter, $config);
|
||||
|
||||
$this->client = $client;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the URL for the file at the given path.
|
||||
*
|
||||
* @param string $path
|
||||
* @return string
|
||||
*
|
||||
* @throws \RuntimeException
|
||||
*/
|
||||
public function url($path)
|
||||
{
|
||||
// If an explicit base URL has been set on the disk configuration then we will use
|
||||
// it as the base URL instead of the default path. This allows the developer to
|
||||
// have full control over the base path for this filesystem's generated URLs.
|
||||
if (isset($this->config['url'])) {
|
||||
return $this->concatPathToUrl($this->config['url'], $this->prefixer->prefixPath($path));
|
||||
}
|
||||
|
||||
return $this->client->getObjectUrl(
|
||||
$this->config['bucket'], $this->prefixer->prefixPath($path)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine if temporary URLs can be generated.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function providesTemporaryUrls()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a temporary URL for the file at the given path.
|
||||
*
|
||||
* @param string $path
|
||||
* @param \DateTimeInterface $expiration
|
||||
* @param array $options
|
||||
* @return string
|
||||
*/
|
||||
public function temporaryUrl($path, $expiration, array $options = [])
|
||||
{
|
||||
$command = $this->client->getCommand('GetObject', array_merge([
|
||||
'Bucket' => $this->config['bucket'],
|
||||
'Key' => $this->prefixer->prefixPath($path),
|
||||
], $options));
|
||||
|
||||
$uri = $this->client->createPresignedRequest(
|
||||
$command, $expiration, $options
|
||||
)->getUri();
|
||||
|
||||
// If an explicit base URL has been set on the disk configuration then we will use
|
||||
// it as the base URL instead of the default path. This allows the developer to
|
||||
// have full control over the base path for this filesystem's generated URLs.
|
||||
if (isset($this->config['temporary_url'])) {
|
||||
$uri = $this->replaceBaseUrl($uri, $this->config['temporary_url']);
|
||||
}
|
||||
|
||||
return (string) $uri;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a temporary upload URL for the file at the given path.
|
||||
*
|
||||
* @param string $path
|
||||
* @param \DateTimeInterface $expiration
|
||||
* @param array $options
|
||||
* @return array
|
||||
*/
|
||||
public function temporaryUploadUrl($path, $expiration, array $options = [])
|
||||
{
|
||||
$command = $this->client->getCommand('PutObject', array_merge([
|
||||
'Bucket' => $this->config['bucket'],
|
||||
'Key' => $this->prefixer->prefixPath($path),
|
||||
], $options));
|
||||
|
||||
$signedRequest = $this->client->createPresignedRequest(
|
||||
$command, $expiration, $options
|
||||
);
|
||||
|
||||
$uri = $signedRequest->getUri();
|
||||
|
||||
// If an explicit base URL has been set on the disk configuration then we will use
|
||||
// it as the base URL instead of the default path. This allows the developer to
|
||||
// have full control over the base path for this filesystem's generated URLs.
|
||||
if (isset($this->config['temporary_url'])) {
|
||||
$uri = $this->replaceBaseUrl($uri, $this->config['temporary_url']);
|
||||
}
|
||||
|
||||
return [
|
||||
'url' => (string) $uri,
|
||||
'headers' => $signedRequest->getHeaders(),
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the underlying S3 client.
|
||||
*
|
||||
* @return \Aws\S3\S3Client
|
||||
*/
|
||||
public function getClient()
|
||||
{
|
||||
return $this->client;
|
||||
}
|
||||
}
|
792
vendor/laravel/framework/src/Illuminate/Filesystem/Filesystem.php
vendored
Normal file
792
vendor/laravel/framework/src/Illuminate/Filesystem/Filesystem.php
vendored
Normal file
@ -0,0 +1,792 @@
|
||||
<?php
|
||||
|
||||
namespace Illuminate\Filesystem;
|
||||
|
||||
use ErrorException;
|
||||
use FilesystemIterator;
|
||||
use Illuminate\Contracts\Filesystem\FileNotFoundException;
|
||||
use Illuminate\Support\LazyCollection;
|
||||
use Illuminate\Support\Traits\Conditionable;
|
||||
use Illuminate\Support\Traits\Macroable;
|
||||
use RuntimeException;
|
||||
use SplFileObject;
|
||||
use Symfony\Component\Filesystem\Filesystem as SymfonyFilesystem;
|
||||
use Symfony\Component\Finder\Finder;
|
||||
use Symfony\Component\Mime\MimeTypes;
|
||||
|
||||
class Filesystem
|
||||
{
|
||||
use Conditionable, Macroable;
|
||||
|
||||
/**
|
||||
* Determine if a file or directory exists.
|
||||
*
|
||||
* @param string $path
|
||||
* @return bool
|
||||
*/
|
||||
public function exists($path)
|
||||
{
|
||||
return file_exists($path);
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine if a file or directory is missing.
|
||||
*
|
||||
* @param string $path
|
||||
* @return bool
|
||||
*/
|
||||
public function missing($path)
|
||||
{
|
||||
return ! $this->exists($path);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the contents of a file.
|
||||
*
|
||||
* @param string $path
|
||||
* @param bool $lock
|
||||
* @return string
|
||||
*
|
||||
* @throws \Illuminate\Contracts\Filesystem\FileNotFoundException
|
||||
*/
|
||||
public function get($path, $lock = false)
|
||||
{
|
||||
if ($this->isFile($path)) {
|
||||
return $lock ? $this->sharedGet($path) : file_get_contents($path);
|
||||
}
|
||||
|
||||
throw new FileNotFoundException("File does not exist at path {$path}.");
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the contents of a file as decoded JSON.
|
||||
*
|
||||
* @param string $path
|
||||
* @param int $flags
|
||||
* @param bool $lock
|
||||
* @return array
|
||||
*
|
||||
* @throws \Illuminate\Contracts\Filesystem\FileNotFoundException
|
||||
*/
|
||||
public function json($path, $flags = 0, $lock = false)
|
||||
{
|
||||
return json_decode($this->get($path, $lock), true, 512, $flags);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get contents of a file with shared access.
|
||||
*
|
||||
* @param string $path
|
||||
* @return string
|
||||
*/
|
||||
public function sharedGet($path)
|
||||
{
|
||||
$contents = '';
|
||||
|
||||
$handle = fopen($path, 'rb');
|
||||
|
||||
if ($handle) {
|
||||
try {
|
||||
if (flock($handle, LOCK_SH)) {
|
||||
clearstatcache(true, $path);
|
||||
|
||||
$contents = fread($handle, $this->size($path) ?: 1);
|
||||
|
||||
flock($handle, LOCK_UN);
|
||||
}
|
||||
} finally {
|
||||
fclose($handle);
|
||||
}
|
||||
}
|
||||
|
||||
return $contents;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the returned value of a file.
|
||||
*
|
||||
* @param string $path
|
||||
* @param array $data
|
||||
* @return mixed
|
||||
*
|
||||
* @throws \Illuminate\Contracts\Filesystem\FileNotFoundException
|
||||
*/
|
||||
public function getRequire($path, array $data = [])
|
||||
{
|
||||
if ($this->isFile($path)) {
|
||||
$__path = $path;
|
||||
$__data = $data;
|
||||
|
||||
return (static function () use ($__path, $__data) {
|
||||
extract($__data, EXTR_SKIP);
|
||||
|
||||
return require $__path;
|
||||
})();
|
||||
}
|
||||
|
||||
throw new FileNotFoundException("File does not exist at path {$path}.");
|
||||
}
|
||||
|
||||
/**
|
||||
* Require the given file once.
|
||||
*
|
||||
* @param string $path
|
||||
* @param array $data
|
||||
* @return mixed
|
||||
*
|
||||
* @throws \Illuminate\Contracts\Filesystem\FileNotFoundException
|
||||
*/
|
||||
public function requireOnce($path, array $data = [])
|
||||
{
|
||||
if ($this->isFile($path)) {
|
||||
$__path = $path;
|
||||
$__data = $data;
|
||||
|
||||
return (static function () use ($__path, $__data) {
|
||||
extract($__data, EXTR_SKIP);
|
||||
|
||||
return require_once $__path;
|
||||
})();
|
||||
}
|
||||
|
||||
throw new FileNotFoundException("File does not exist at path {$path}.");
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the contents of a file one line at a time.
|
||||
*
|
||||
* @param string $path
|
||||
* @return \Illuminate\Support\LazyCollection
|
||||
*
|
||||
* @throws \Illuminate\Contracts\Filesystem\FileNotFoundException
|
||||
*/
|
||||
public function lines($path)
|
||||
{
|
||||
if (! $this->isFile($path)) {
|
||||
throw new FileNotFoundException(
|
||||
"File does not exist at path {$path}."
|
||||
);
|
||||
}
|
||||
|
||||
return LazyCollection::make(function () use ($path) {
|
||||
$file = new SplFileObject($path);
|
||||
|
||||
$file->setFlags(SplFileObject::DROP_NEW_LINE);
|
||||
|
||||
while (! $file->eof()) {
|
||||
yield $file->fgets();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the hash of the file at the given path.
|
||||
*
|
||||
* @param string $path
|
||||
* @param string $algorithm
|
||||
* @return string
|
||||
*/
|
||||
public function hash($path, $algorithm = 'md5')
|
||||
{
|
||||
return hash_file($algorithm, $path);
|
||||
}
|
||||
|
||||
/**
|
||||
* Write the contents of a file.
|
||||
*
|
||||
* @param string $path
|
||||
* @param string $contents
|
||||
* @param bool $lock
|
||||
* @return int|bool
|
||||
*/
|
||||
public function put($path, $contents, $lock = false)
|
||||
{
|
||||
return file_put_contents($path, $contents, $lock ? LOCK_EX : 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Write the contents of a file, replacing it atomically if it already exists.
|
||||
*
|
||||
* @param string $path
|
||||
* @param string $content
|
||||
* @param int|null $mode
|
||||
* @return void
|
||||
*/
|
||||
public function replace($path, $content, $mode = null)
|
||||
{
|
||||
// If the path already exists and is a symlink, get the real path...
|
||||
clearstatcache(true, $path);
|
||||
|
||||
$path = realpath($path) ?: $path;
|
||||
|
||||
$tempPath = tempnam(dirname($path), basename($path));
|
||||
|
||||
// Fix permissions of tempPath because `tempnam()` creates it with permissions set to 0600...
|
||||
if (! is_null($mode)) {
|
||||
chmod($tempPath, $mode);
|
||||
} else {
|
||||
chmod($tempPath, 0777 - umask());
|
||||
}
|
||||
|
||||
file_put_contents($tempPath, $content);
|
||||
|
||||
rename($tempPath, $path);
|
||||
}
|
||||
|
||||
/**
|
||||
* Replace a given string within a given file.
|
||||
*
|
||||
* @param array|string $search
|
||||
* @param array|string $replace
|
||||
* @param string $path
|
||||
* @return void
|
||||
*/
|
||||
public function replaceInFile($search, $replace, $path)
|
||||
{
|
||||
file_put_contents($path, str_replace($search, $replace, file_get_contents($path)));
|
||||
}
|
||||
|
||||
/**
|
||||
* Prepend to a file.
|
||||
*
|
||||
* @param string $path
|
||||
* @param string $data
|
||||
* @return int
|
||||
*/
|
||||
public function prepend($path, $data)
|
||||
{
|
||||
if ($this->exists($path)) {
|
||||
return $this->put($path, $data.$this->get($path));
|
||||
}
|
||||
|
||||
return $this->put($path, $data);
|
||||
}
|
||||
|
||||
/**
|
||||
* Append to a file.
|
||||
*
|
||||
* @param string $path
|
||||
* @param string $data
|
||||
* @param bool $lock
|
||||
* @return int
|
||||
*/
|
||||
public function append($path, $data, $lock = false)
|
||||
{
|
||||
return file_put_contents($path, $data, FILE_APPEND | ($lock ? LOCK_EX : 0));
|
||||
}
|
||||
|
||||
/**
|
||||
* Get or set UNIX mode of a file or directory.
|
||||
*
|
||||
* @param string $path
|
||||
* @param int|null $mode
|
||||
* @return mixed
|
||||
*/
|
||||
public function chmod($path, $mode = null)
|
||||
{
|
||||
if ($mode) {
|
||||
return chmod($path, $mode);
|
||||
}
|
||||
|
||||
return substr(sprintf('%o', fileperms($path)), -4);
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete the file at a given path.
|
||||
*
|
||||
* @param string|array $paths
|
||||
* @return bool
|
||||
*/
|
||||
public function delete($paths)
|
||||
{
|
||||
$paths = is_array($paths) ? $paths : func_get_args();
|
||||
|
||||
$success = true;
|
||||
|
||||
foreach ($paths as $path) {
|
||||
try {
|
||||
if (@unlink($path)) {
|
||||
clearstatcache(false, $path);
|
||||
} else {
|
||||
$success = false;
|
||||
}
|
||||
} catch (ErrorException) {
|
||||
$success = false;
|
||||
}
|
||||
}
|
||||
|
||||
return $success;
|
||||
}
|
||||
|
||||
/**
|
||||
* Move a file to a new location.
|
||||
*
|
||||
* @param string $path
|
||||
* @param string $target
|
||||
* @return bool
|
||||
*/
|
||||
public function move($path, $target)
|
||||
{
|
||||
return rename($path, $target);
|
||||
}
|
||||
|
||||
/**
|
||||
* Copy a file to a new location.
|
||||
*
|
||||
* @param string $path
|
||||
* @param string $target
|
||||
* @return bool
|
||||
*/
|
||||
public function copy($path, $target)
|
||||
{
|
||||
return copy($path, $target);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a symlink to the target file or directory. On Windows, a hard link is created if the target is a file.
|
||||
*
|
||||
* @param string $target
|
||||
* @param string $link
|
||||
* @return bool|null
|
||||
*/
|
||||
public function link($target, $link)
|
||||
{
|
||||
if (! windows_os()) {
|
||||
return symlink($target, $link);
|
||||
}
|
||||
|
||||
$mode = $this->isDirectory($target) ? 'J' : 'H';
|
||||
|
||||
exec("mklink /{$mode} ".escapeshellarg($link).' '.escapeshellarg($target));
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a relative symlink to the target file or directory.
|
||||
*
|
||||
* @param string $target
|
||||
* @param string $link
|
||||
* @return void
|
||||
*
|
||||
* @throws \RuntimeException
|
||||
*/
|
||||
public function relativeLink($target, $link)
|
||||
{
|
||||
if (! class_exists(SymfonyFilesystem::class)) {
|
||||
throw new RuntimeException(
|
||||
'To enable support for relative links, please install the symfony/filesystem package.'
|
||||
);
|
||||
}
|
||||
|
||||
$relativeTarget = (new SymfonyFilesystem)->makePathRelative($target, dirname($link));
|
||||
|
||||
$this->link($this->isFile($target) ? rtrim($relativeTarget, '/') : $relativeTarget, $link);
|
||||
}
|
||||
|
||||
/**
|
||||
* Extract the file name from a file path.
|
||||
*
|
||||
* @param string $path
|
||||
* @return string
|
||||
*/
|
||||
public function name($path)
|
||||
{
|
||||
return pathinfo($path, PATHINFO_FILENAME);
|
||||
}
|
||||
|
||||
/**
|
||||
* Extract the trailing name component from a file path.
|
||||
*
|
||||
* @param string $path
|
||||
* @return string
|
||||
*/
|
||||
public function basename($path)
|
||||
{
|
||||
return pathinfo($path, PATHINFO_BASENAME);
|
||||
}
|
||||
|
||||
/**
|
||||
* Extract the parent directory from a file path.
|
||||
*
|
||||
* @param string $path
|
||||
* @return string
|
||||
*/
|
||||
public function dirname($path)
|
||||
{
|
||||
return pathinfo($path, PATHINFO_DIRNAME);
|
||||
}
|
||||
|
||||
/**
|
||||
* Extract the file extension from a file path.
|
||||
*
|
||||
* @param string $path
|
||||
* @return string
|
||||
*/
|
||||
public function extension($path)
|
||||
{
|
||||
return pathinfo($path, PATHINFO_EXTENSION);
|
||||
}
|
||||
|
||||
/**
|
||||
* Guess the file extension from the mime-type of a given file.
|
||||
*
|
||||
* @param string $path
|
||||
* @return string|null
|
||||
*
|
||||
* @throws \RuntimeException
|
||||
*/
|
||||
public function guessExtension($path)
|
||||
{
|
||||
if (! class_exists(MimeTypes::class)) {
|
||||
throw new RuntimeException(
|
||||
'To enable support for guessing extensions, please install the symfony/mime package.'
|
||||
);
|
||||
}
|
||||
|
||||
return (new MimeTypes)->getExtensions($this->mimeType($path))[0] ?? null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the file type of a given file.
|
||||
*
|
||||
* @param string $path
|
||||
* @return string
|
||||
*/
|
||||
public function type($path)
|
||||
{
|
||||
return filetype($path);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the mime-type of a given file.
|
||||
*
|
||||
* @param string $path
|
||||
* @return string|false
|
||||
*/
|
||||
public function mimeType($path)
|
||||
{
|
||||
return finfo_file(finfo_open(FILEINFO_MIME_TYPE), $path);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the file size of a given file.
|
||||
*
|
||||
* @param string $path
|
||||
* @return int
|
||||
*/
|
||||
public function size($path)
|
||||
{
|
||||
return filesize($path);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the file's last modification time.
|
||||
*
|
||||
* @param string $path
|
||||
* @return int
|
||||
*/
|
||||
public function lastModified($path)
|
||||
{
|
||||
return filemtime($path);
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine if the given path is a directory.
|
||||
*
|
||||
* @param string $directory
|
||||
* @return bool
|
||||
*/
|
||||
public function isDirectory($directory)
|
||||
{
|
||||
return is_dir($directory);
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine if the given path is a directory that does not contain any other files or directories.
|
||||
*
|
||||
* @param string $directory
|
||||
* @param bool $ignoreDotFiles
|
||||
* @return bool
|
||||
*/
|
||||
public function isEmptyDirectory($directory, $ignoreDotFiles = false)
|
||||
{
|
||||
return ! Finder::create()->ignoreDotFiles($ignoreDotFiles)->in($directory)->depth(0)->hasResults();
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine if the given path is readable.
|
||||
*
|
||||
* @param string $path
|
||||
* @return bool
|
||||
*/
|
||||
public function isReadable($path)
|
||||
{
|
||||
return is_readable($path);
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine if the given path is writable.
|
||||
*
|
||||
* @param string $path
|
||||
* @return bool
|
||||
*/
|
||||
public function isWritable($path)
|
||||
{
|
||||
return is_writable($path);
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine if two files are the same by comparing their hashes.
|
||||
*
|
||||
* @param string $firstFile
|
||||
* @param string $secondFile
|
||||
* @return bool
|
||||
*/
|
||||
public function hasSameHash($firstFile, $secondFile)
|
||||
{
|
||||
$hash = @md5_file($firstFile);
|
||||
|
||||
return $hash && hash_equals($hash, (string) @md5_file($secondFile));
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine if the given path is a file.
|
||||
*
|
||||
* @param string $file
|
||||
* @return bool
|
||||
*/
|
||||
public function isFile($file)
|
||||
{
|
||||
return is_file($file);
|
||||
}
|
||||
|
||||
/**
|
||||
* Find path names matching a given pattern.
|
||||
*
|
||||
* @param string $pattern
|
||||
* @param int $flags
|
||||
* @return array
|
||||
*/
|
||||
public function glob($pattern, $flags = 0)
|
||||
{
|
||||
return glob($pattern, $flags);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get an array of all files in a directory.
|
||||
*
|
||||
* @param string $directory
|
||||
* @param bool $hidden
|
||||
* @return \Symfony\Component\Finder\SplFileInfo[]
|
||||
*/
|
||||
public function files($directory, $hidden = false)
|
||||
{
|
||||
return iterator_to_array(
|
||||
Finder::create()->files()->ignoreDotFiles(! $hidden)->in($directory)->depth(0)->sortByName(),
|
||||
false
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all of the files from the given directory (recursive).
|
||||
*
|
||||
* @param string $directory
|
||||
* @param bool $hidden
|
||||
* @return \Symfony\Component\Finder\SplFileInfo[]
|
||||
*/
|
||||
public function allFiles($directory, $hidden = false)
|
||||
{
|
||||
return iterator_to_array(
|
||||
Finder::create()->files()->ignoreDotFiles(! $hidden)->in($directory)->sortByName(),
|
||||
false
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all of the directories within a given directory.
|
||||
*
|
||||
* @param string $directory
|
||||
* @return array
|
||||
*/
|
||||
public function directories($directory)
|
||||
{
|
||||
$directories = [];
|
||||
|
||||
foreach (Finder::create()->in($directory)->directories()->depth(0)->sortByName() as $dir) {
|
||||
$directories[] = $dir->getPathname();
|
||||
}
|
||||
|
||||
return $directories;
|
||||
}
|
||||
|
||||
/**
|
||||
* Ensure a directory exists.
|
||||
*
|
||||
* @param string $path
|
||||
* @param int $mode
|
||||
* @param bool $recursive
|
||||
* @return void
|
||||
*/
|
||||
public function ensureDirectoryExists($path, $mode = 0755, $recursive = true)
|
||||
{
|
||||
if (! $this->isDirectory($path)) {
|
||||
$this->makeDirectory($path, $mode, $recursive);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a directory.
|
||||
*
|
||||
* @param string $path
|
||||
* @param int $mode
|
||||
* @param bool $recursive
|
||||
* @param bool $force
|
||||
* @return bool
|
||||
*/
|
||||
public function makeDirectory($path, $mode = 0755, $recursive = false, $force = false)
|
||||
{
|
||||
if ($force) {
|
||||
return @mkdir($path, $mode, $recursive);
|
||||
}
|
||||
|
||||
return mkdir($path, $mode, $recursive);
|
||||
}
|
||||
|
||||
/**
|
||||
* Move a directory.
|
||||
*
|
||||
* @param string $from
|
||||
* @param string $to
|
||||
* @param bool $overwrite
|
||||
* @return bool
|
||||
*/
|
||||
public function moveDirectory($from, $to, $overwrite = false)
|
||||
{
|
||||
if ($overwrite && $this->isDirectory($to) && ! $this->deleteDirectory($to)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return @rename($from, $to) === true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Copy a directory from one location to another.
|
||||
*
|
||||
* @param string $directory
|
||||
* @param string $destination
|
||||
* @param int|null $options
|
||||
* @return bool
|
||||
*/
|
||||
public function copyDirectory($directory, $destination, $options = null)
|
||||
{
|
||||
if (! $this->isDirectory($directory)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$options = $options ?: FilesystemIterator::SKIP_DOTS;
|
||||
|
||||
// If the destination directory does not actually exist, we will go ahead and
|
||||
// create it recursively, which just gets the destination prepared to copy
|
||||
// the files over. Once we make the directory we'll proceed the copying.
|
||||
$this->ensureDirectoryExists($destination, 0777);
|
||||
|
||||
$items = new FilesystemIterator($directory, $options);
|
||||
|
||||
foreach ($items as $item) {
|
||||
// As we spin through items, we will check to see if the current file is actually
|
||||
// a directory or a file. When it is actually a directory we will need to call
|
||||
// back into this function recursively to keep copying these nested folders.
|
||||
$target = $destination.'/'.$item->getBasename();
|
||||
|
||||
if ($item->isDir()) {
|
||||
$path = $item->getPathname();
|
||||
|
||||
if (! $this->copyDirectory($path, $target, $options)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// If the current items is just a regular file, we will just copy this to the new
|
||||
// location and keep looping. If for some reason the copy fails we'll bail out
|
||||
// and return false, so the developer is aware that the copy process failed.
|
||||
elseif (! $this->copy($item->getPathname(), $target)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Recursively delete a directory.
|
||||
*
|
||||
* The directory itself may be optionally preserved.
|
||||
*
|
||||
* @param string $directory
|
||||
* @param bool $preserve
|
||||
* @return bool
|
||||
*/
|
||||
public function deleteDirectory($directory, $preserve = false)
|
||||
{
|
||||
if (! $this->isDirectory($directory)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$items = new FilesystemIterator($directory);
|
||||
|
||||
foreach ($items as $item) {
|
||||
// If the item is a directory, we can just recurse into the function and
|
||||
// delete that sub-directory otherwise we'll just delete the file and
|
||||
// keep iterating through each file until the directory is cleaned.
|
||||
if ($item->isDir() && ! $item->isLink()) {
|
||||
$this->deleteDirectory($item->getPathname());
|
||||
}
|
||||
|
||||
// If the item is just a file, we can go ahead and delete it since we're
|
||||
// just looping through and waxing all of the files in this directory
|
||||
// and calling directories recursively, so we delete the real path.
|
||||
else {
|
||||
$this->delete($item->getPathname());
|
||||
}
|
||||
}
|
||||
|
||||
unset($items);
|
||||
|
||||
if (! $preserve) {
|
||||
@rmdir($directory);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove all of the directories within a given directory.
|
||||
*
|
||||
* @param string $directory
|
||||
* @return bool
|
||||
*/
|
||||
public function deleteDirectories($directory)
|
||||
{
|
||||
$allDirectories = $this->directories($directory);
|
||||
|
||||
if (! empty($allDirectories)) {
|
||||
foreach ($allDirectories as $directoryName) {
|
||||
$this->deleteDirectory($directoryName);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Empty the specified directory of all files and folders.
|
||||
*
|
||||
* @param string $directory
|
||||
* @return bool
|
||||
*/
|
||||
public function cleanDirectory($directory)
|
||||
{
|
||||
return $this->deleteDirectory($directory, true);
|
||||
}
|
||||
}
|
989
vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemAdapter.php
vendored
Normal file
989
vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemAdapter.php
vendored
Normal file
@ -0,0 +1,989 @@
|
||||
<?php
|
||||
|
||||
namespace Illuminate\Filesystem;
|
||||
|
||||
use Closure;
|
||||
use Illuminate\Contracts\Filesystem\Cloud as CloudFilesystemContract;
|
||||
use Illuminate\Contracts\Filesystem\Filesystem as FilesystemContract;
|
||||
use Illuminate\Http\File;
|
||||
use Illuminate\Http\UploadedFile;
|
||||
use Illuminate\Support\Arr;
|
||||
use Illuminate\Support\Str;
|
||||
use Illuminate\Support\Traits\Conditionable;
|
||||
use Illuminate\Support\Traits\Macroable;
|
||||
use InvalidArgumentException;
|
||||
use League\Flysystem\FilesystemAdapter as FlysystemAdapter;
|
||||
use League\Flysystem\FilesystemOperator;
|
||||
use League\Flysystem\Ftp\FtpAdapter;
|
||||
use League\Flysystem\Local\LocalFilesystemAdapter as LocalAdapter;
|
||||
use League\Flysystem\PathPrefixer;
|
||||
use League\Flysystem\PhpseclibV3\SftpAdapter;
|
||||
use League\Flysystem\StorageAttributes;
|
||||
use League\Flysystem\UnableToCopyFile;
|
||||
use League\Flysystem\UnableToCreateDirectory;
|
||||
use League\Flysystem\UnableToDeleteDirectory;
|
||||
use League\Flysystem\UnableToDeleteFile;
|
||||
use League\Flysystem\UnableToMoveFile;
|
||||
use League\Flysystem\UnableToProvideChecksum;
|
||||
use League\Flysystem\UnableToReadFile;
|
||||
use League\Flysystem\UnableToRetrieveMetadata;
|
||||
use League\Flysystem\UnableToSetVisibility;
|
||||
use League\Flysystem\UnableToWriteFile;
|
||||
use League\Flysystem\Visibility;
|
||||
use PHPUnit\Framework\Assert as PHPUnit;
|
||||
use Psr\Http\Message\StreamInterface;
|
||||
use RuntimeException;
|
||||
use Symfony\Component\HttpFoundation\StreamedResponse;
|
||||
|
||||
/**
|
||||
* @mixin \League\Flysystem\FilesystemOperator
|
||||
*/
|
||||
class FilesystemAdapter implements CloudFilesystemContract
|
||||
{
|
||||
use Conditionable;
|
||||
use Macroable {
|
||||
__call as macroCall;
|
||||
}
|
||||
|
||||
/**
|
||||
* The Flysystem filesystem implementation.
|
||||
*
|
||||
* @var \League\Flysystem\FilesystemOperator
|
||||
*/
|
||||
protected $driver;
|
||||
|
||||
/**
|
||||
* The Flysystem adapter implementation.
|
||||
*
|
||||
* @var \League\Flysystem\FilesystemAdapter
|
||||
*/
|
||||
protected $adapter;
|
||||
|
||||
/**
|
||||
* The filesystem configuration.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $config;
|
||||
|
||||
/**
|
||||
* The Flysystem PathPrefixer instance.
|
||||
*
|
||||
* @var \League\Flysystem\PathPrefixer
|
||||
*/
|
||||
protected $prefixer;
|
||||
|
||||
/**
|
||||
* The temporary URL builder callback.
|
||||
*
|
||||
* @var \Closure|null
|
||||
*/
|
||||
protected $temporaryUrlCallback;
|
||||
|
||||
/**
|
||||
* Create a new filesystem adapter instance.
|
||||
*
|
||||
* @param \League\Flysystem\FilesystemOperator $driver
|
||||
* @param \League\Flysystem\FilesystemAdapter $adapter
|
||||
* @param array $config
|
||||
* @return void
|
||||
*/
|
||||
public function __construct(FilesystemOperator $driver, FlysystemAdapter $adapter, array $config = [])
|
||||
{
|
||||
$this->driver = $driver;
|
||||
$this->adapter = $adapter;
|
||||
$this->config = $config;
|
||||
$separator = $config['directory_separator'] ?? DIRECTORY_SEPARATOR;
|
||||
|
||||
$this->prefixer = new PathPrefixer($config['root'] ?? '', $separator);
|
||||
|
||||
if (isset($config['prefix'])) {
|
||||
$this->prefixer = new PathPrefixer($this->prefixer->prefixPath($config['prefix']), $separator);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Assert that the given file or directory exists.
|
||||
*
|
||||
* @param string|array $path
|
||||
* @param string|null $content
|
||||
* @return $this
|
||||
*/
|
||||
public function assertExists($path, $content = null)
|
||||
{
|
||||
clearstatcache();
|
||||
|
||||
$paths = Arr::wrap($path);
|
||||
|
||||
foreach ($paths as $path) {
|
||||
PHPUnit::assertTrue(
|
||||
$this->exists($path), "Unable to find a file or directory at path [{$path}]."
|
||||
);
|
||||
|
||||
if (! is_null($content)) {
|
||||
$actual = $this->get($path);
|
||||
|
||||
PHPUnit::assertSame(
|
||||
$content,
|
||||
$actual,
|
||||
"File or directory [{$path}] was found, but content [{$actual}] does not match [{$content}]."
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Assert that the given file or directory does not exist.
|
||||
*
|
||||
* @param string|array $path
|
||||
* @return $this
|
||||
*/
|
||||
public function assertMissing($path)
|
||||
{
|
||||
clearstatcache();
|
||||
|
||||
$paths = Arr::wrap($path);
|
||||
|
||||
foreach ($paths as $path) {
|
||||
PHPUnit::assertFalse(
|
||||
$this->exists($path), "Found unexpected file or directory at path [{$path}]."
|
||||
);
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Assert that the given directory is empty.
|
||||
*
|
||||
* @param string $path
|
||||
* @return $this
|
||||
*/
|
||||
public function assertDirectoryEmpty($path)
|
||||
{
|
||||
PHPUnit::assertEmpty(
|
||||
$this->allFiles($path), "Directory [{$path}] is not empty."
|
||||
);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine if a file or directory exists.
|
||||
*
|
||||
* @param string $path
|
||||
* @return bool
|
||||
*/
|
||||
public function exists($path)
|
||||
{
|
||||
return $this->driver->has($path);
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine if a file or directory is missing.
|
||||
*
|
||||
* @param string $path
|
||||
* @return bool
|
||||
*/
|
||||
public function missing($path)
|
||||
{
|
||||
return ! $this->exists($path);
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine if a file exists.
|
||||
*
|
||||
* @param string $path
|
||||
* @return bool
|
||||
*/
|
||||
public function fileExists($path)
|
||||
{
|
||||
return $this->driver->fileExists($path);
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine if a file is missing.
|
||||
*
|
||||
* @param string $path
|
||||
* @return bool
|
||||
*/
|
||||
public function fileMissing($path)
|
||||
{
|
||||
return ! $this->fileExists($path);
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine if a directory exists.
|
||||
*
|
||||
* @param string $path
|
||||
* @return bool
|
||||
*/
|
||||
public function directoryExists($path)
|
||||
{
|
||||
return $this->driver->directoryExists($path);
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine if a directory is missing.
|
||||
*
|
||||
* @param string $path
|
||||
* @return bool
|
||||
*/
|
||||
public function directoryMissing($path)
|
||||
{
|
||||
return ! $this->directoryExists($path);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the full path for the file at the given "short" path.
|
||||
*
|
||||
* @param string $path
|
||||
* @return string
|
||||
*/
|
||||
public function path($path)
|
||||
{
|
||||
return $this->prefixer->prefixPath($path);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the contents of a file.
|
||||
*
|
||||
* @param string $path
|
||||
* @return string|null
|
||||
*/
|
||||
public function get($path)
|
||||
{
|
||||
try {
|
||||
return $this->driver->read($path);
|
||||
} catch (UnableToReadFile $e) {
|
||||
throw_if($this->throwsExceptions(), $e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the contents of a file as decoded JSON.
|
||||
*
|
||||
* @param string $path
|
||||
* @param int $flags
|
||||
* @return array|null
|
||||
*/
|
||||
public function json($path, $flags = 0)
|
||||
{
|
||||
$content = $this->get($path);
|
||||
|
||||
return is_null($content) ? null : json_decode($content, true, 512, $flags);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a streamed response for a given file.
|
||||
*
|
||||
* @param string $path
|
||||
* @param string|null $name
|
||||
* @param array $headers
|
||||
* @param string|null $disposition
|
||||
* @return \Symfony\Component\HttpFoundation\StreamedResponse
|
||||
*/
|
||||
public function response($path, $name = null, array $headers = [], $disposition = 'inline')
|
||||
{
|
||||
$response = new StreamedResponse;
|
||||
|
||||
$headers['Content-Type'] ??= $this->mimeType($path);
|
||||
$headers['Content-Length'] ??= $this->size($path);
|
||||
|
||||
if (! array_key_exists('Content-Disposition', $headers)) {
|
||||
$filename = $name ?? basename($path);
|
||||
|
||||
$disposition = $response->headers->makeDisposition(
|
||||
$disposition, $filename, $this->fallbackName($filename)
|
||||
);
|
||||
|
||||
$headers['Content-Disposition'] = $disposition;
|
||||
}
|
||||
|
||||
$response->headers->replace($headers);
|
||||
|
||||
$response->setCallback(function () use ($path) {
|
||||
$stream = $this->readStream($path);
|
||||
fpassthru($stream);
|
||||
fclose($stream);
|
||||
});
|
||||
|
||||
return $response;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a streamed download response for a given file.
|
||||
*
|
||||
* @param string $path
|
||||
* @param string|null $name
|
||||
* @return \Symfony\Component\HttpFoundation\StreamedResponse
|
||||
*/
|
||||
public function download($path, $name = null, array $headers = [])
|
||||
{
|
||||
return $this->response($path, $name, $headers, 'attachment');
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert the string to ASCII characters that are equivalent to the given name.
|
||||
*
|
||||
* @param string $name
|
||||
* @return string
|
||||
*/
|
||||
protected function fallbackName($name)
|
||||
{
|
||||
return str_replace('%', '', Str::ascii($name));
|
||||
}
|
||||
|
||||
/**
|
||||
* Write the contents of a file.
|
||||
*
|
||||
* @param string $path
|
||||
* @param \Psr\Http\Message\StreamInterface|\Illuminate\Http\File|\Illuminate\Http\UploadedFile|string|resource $contents
|
||||
* @param mixed $options
|
||||
* @return string|bool
|
||||
*/
|
||||
public function put($path, $contents, $options = [])
|
||||
{
|
||||
$options = is_string($options)
|
||||
? ['visibility' => $options]
|
||||
: (array) $options;
|
||||
|
||||
// If the given contents is actually a file or uploaded file instance than we will
|
||||
// automatically store the file using a stream. This provides a convenient path
|
||||
// for the developer to store streams without managing them manually in code.
|
||||
if ($contents instanceof File ||
|
||||
$contents instanceof UploadedFile) {
|
||||
return $this->putFile($path, $contents, $options);
|
||||
}
|
||||
|
||||
try {
|
||||
if ($contents instanceof StreamInterface) {
|
||||
$this->driver->writeStream($path, $contents->detach(), $options);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
is_resource($contents)
|
||||
? $this->driver->writeStream($path, $contents, $options)
|
||||
: $this->driver->write($path, $contents, $options);
|
||||
} catch (UnableToWriteFile|UnableToSetVisibility $e) {
|
||||
throw_if($this->throwsExceptions(), $e);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Store the uploaded file on the disk.
|
||||
*
|
||||
* @param \Illuminate\Http\File|\Illuminate\Http\UploadedFile|string $path
|
||||
* @param \Illuminate\Http\File|\Illuminate\Http\UploadedFile|string|array|null $file
|
||||
* @param mixed $options
|
||||
* @return string|false
|
||||
*/
|
||||
public function putFile($path, $file = null, $options = [])
|
||||
{
|
||||
if (is_null($file) || is_array($file)) {
|
||||
[$path, $file, $options] = ['', $path, $file ?? []];
|
||||
}
|
||||
|
||||
$file = is_string($file) ? new File($file) : $file;
|
||||
|
||||
return $this->putFileAs($path, $file, $file->hashName(), $options);
|
||||
}
|
||||
|
||||
/**
|
||||
* Store the uploaded file on the disk with a given name.
|
||||
*
|
||||
* @param \Illuminate\Http\File|\Illuminate\Http\UploadedFile|string $path
|
||||
* @param \Illuminate\Http\File|\Illuminate\Http\UploadedFile|string|array|null $file
|
||||
* @param string|array|null $name
|
||||
* @param mixed $options
|
||||
* @return string|false
|
||||
*/
|
||||
public function putFileAs($path, $file, $name = null, $options = [])
|
||||
{
|
||||
if (is_null($name) || is_array($name)) {
|
||||
[$path, $file, $name, $options] = ['', $path, $file, $name ?? []];
|
||||
}
|
||||
|
||||
$stream = fopen(is_string($file) ? $file : $file->getRealPath(), 'r');
|
||||
|
||||
// Next, we will format the path of the file and store the file using a stream since
|
||||
// they provide better performance than alternatives. Once we write the file this
|
||||
// stream will get closed automatically by us so the developer doesn't have to.
|
||||
$result = $this->put(
|
||||
$path = trim($path.'/'.$name, '/'), $stream, $options
|
||||
);
|
||||
|
||||
if (is_resource($stream)) {
|
||||
fclose($stream);
|
||||
}
|
||||
|
||||
return $result ? $path : false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the visibility for the given path.
|
||||
*
|
||||
* @param string $path
|
||||
* @return string
|
||||
*/
|
||||
public function getVisibility($path)
|
||||
{
|
||||
if ($this->driver->visibility($path) == Visibility::PUBLIC) {
|
||||
return FilesystemContract::VISIBILITY_PUBLIC;
|
||||
}
|
||||
|
||||
return FilesystemContract::VISIBILITY_PRIVATE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the visibility for the given path.
|
||||
*
|
||||
* @param string $path
|
||||
* @param string $visibility
|
||||
* @return bool
|
||||
*/
|
||||
public function setVisibility($path, $visibility)
|
||||
{
|
||||
try {
|
||||
$this->driver->setVisibility($path, $this->parseVisibility($visibility));
|
||||
} catch (UnableToSetVisibility $e) {
|
||||
throw_if($this->throwsExceptions(), $e);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Prepend to a file.
|
||||
*
|
||||
* @param string $path
|
||||
* @param string $data
|
||||
* @param string $separator
|
||||
* @return bool
|
||||
*/
|
||||
public function prepend($path, $data, $separator = PHP_EOL)
|
||||
{
|
||||
if ($this->fileExists($path)) {
|
||||
return $this->put($path, $data.$separator.$this->get($path));
|
||||
}
|
||||
|
||||
return $this->put($path, $data);
|
||||
}
|
||||
|
||||
/**
|
||||
* Append to a file.
|
||||
*
|
||||
* @param string $path
|
||||
* @param string $data
|
||||
* @param string $separator
|
||||
* @return bool
|
||||
*/
|
||||
public function append($path, $data, $separator = PHP_EOL)
|
||||
{
|
||||
if ($this->fileExists($path)) {
|
||||
return $this->put($path, $this->get($path).$separator.$data);
|
||||
}
|
||||
|
||||
return $this->put($path, $data);
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete the file at a given path.
|
||||
*
|
||||
* @param string|array $paths
|
||||
* @return bool
|
||||
*/
|
||||
public function delete($paths)
|
||||
{
|
||||
$paths = is_array($paths) ? $paths : func_get_args();
|
||||
|
||||
$success = true;
|
||||
|
||||
foreach ($paths as $path) {
|
||||
try {
|
||||
$this->driver->delete($path);
|
||||
} catch (UnableToDeleteFile $e) {
|
||||
throw_if($this->throwsExceptions(), $e);
|
||||
|
||||
$success = false;
|
||||
}
|
||||
}
|
||||
|
||||
return $success;
|
||||
}
|
||||
|
||||
/**
|
||||
* Copy a file to a new location.
|
||||
*
|
||||
* @param string $from
|
||||
* @param string $to
|
||||
* @return bool
|
||||
*/
|
||||
public function copy($from, $to)
|
||||
{
|
||||
try {
|
||||
$this->driver->copy($from, $to);
|
||||
} catch (UnableToCopyFile $e) {
|
||||
throw_if($this->throwsExceptions(), $e);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Move a file to a new location.
|
||||
*
|
||||
* @param string $from
|
||||
* @param string $to
|
||||
* @return bool
|
||||
*/
|
||||
public function move($from, $to)
|
||||
{
|
||||
try {
|
||||
$this->driver->move($from, $to);
|
||||
} catch (UnableToMoveFile $e) {
|
||||
throw_if($this->throwsExceptions(), $e);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the file size of a given file.
|
||||
*
|
||||
* @param string $path
|
||||
* @return int
|
||||
*/
|
||||
public function size($path)
|
||||
{
|
||||
return $this->driver->fileSize($path);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the checksum for a file.
|
||||
*
|
||||
* @return string|false
|
||||
*
|
||||
* @throws UnableToProvideChecksum
|
||||
*/
|
||||
public function checksum(string $path, array $options = [])
|
||||
{
|
||||
try {
|
||||
return $this->driver->checksum($path, $options);
|
||||
} catch (UnableToProvideChecksum $e) {
|
||||
throw_if($this->throwsExceptions(), $e);
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the mime-type of a given file.
|
||||
*
|
||||
* @param string $path
|
||||
* @return string|false
|
||||
*/
|
||||
public function mimeType($path)
|
||||
{
|
||||
try {
|
||||
return $this->driver->mimeType($path);
|
||||
} catch (UnableToRetrieveMetadata $e) {
|
||||
throw_if($this->throwsExceptions(), $e);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the file's last modification time.
|
||||
*
|
||||
* @param string $path
|
||||
* @return int
|
||||
*/
|
||||
public function lastModified($path)
|
||||
{
|
||||
return $this->driver->lastModified($path);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function readStream($path)
|
||||
{
|
||||
try {
|
||||
return $this->driver->readStream($path);
|
||||
} catch (UnableToReadFile $e) {
|
||||
throw_if($this->throwsExceptions(), $e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function writeStream($path, $resource, array $options = [])
|
||||
{
|
||||
try {
|
||||
$this->driver->writeStream($path, $resource, $options);
|
||||
} catch (UnableToWriteFile|UnableToSetVisibility $e) {
|
||||
throw_if($this->throwsExceptions(), $e);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the URL for the file at the given path.
|
||||
*
|
||||
* @param string $path
|
||||
* @return string
|
||||
*
|
||||
* @throws \RuntimeException
|
||||
*/
|
||||
public function url($path)
|
||||
{
|
||||
if (isset($this->config['prefix'])) {
|
||||
$path = $this->concatPathToUrl($this->config['prefix'], $path);
|
||||
}
|
||||
|
||||
$adapter = $this->adapter;
|
||||
|
||||
if (method_exists($adapter, 'getUrl')) {
|
||||
return $adapter->getUrl($path);
|
||||
} elseif (method_exists($this->driver, 'getUrl')) {
|
||||
return $this->driver->getUrl($path);
|
||||
} elseif ($adapter instanceof FtpAdapter || $adapter instanceof SftpAdapter) {
|
||||
return $this->getFtpUrl($path);
|
||||
} elseif ($adapter instanceof LocalAdapter) {
|
||||
return $this->getLocalUrl($path);
|
||||
} else {
|
||||
throw new RuntimeException('This driver does not support retrieving URLs.');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the URL for the file at the given path.
|
||||
*
|
||||
* @param string $path
|
||||
* @return string
|
||||
*/
|
||||
protected function getFtpUrl($path)
|
||||
{
|
||||
return isset($this->config['url'])
|
||||
? $this->concatPathToUrl($this->config['url'], $path)
|
||||
: $path;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the URL for the file at the given path.
|
||||
*
|
||||
* @param string $path
|
||||
* @return string
|
||||
*/
|
||||
protected function getLocalUrl($path)
|
||||
{
|
||||
// If an explicit base URL has been set on the disk configuration then we will use
|
||||
// it as the base URL instead of the default path. This allows the developer to
|
||||
// have full control over the base path for this filesystem's generated URLs.
|
||||
if (isset($this->config['url'])) {
|
||||
return $this->concatPathToUrl($this->config['url'], $path);
|
||||
}
|
||||
|
||||
$path = '/storage/'.$path;
|
||||
|
||||
// If the path contains "storage/public", it probably means the developer is using
|
||||
// the default disk to generate the path instead of the "public" disk like they
|
||||
// are really supposed to use. We will remove the public from this path here.
|
||||
if (str_contains($path, '/storage/public/')) {
|
||||
return Str::replaceFirst('/public/', '/', $path);
|
||||
}
|
||||
|
||||
return $path;
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine if temporary URLs can be generated.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function providesTemporaryUrls()
|
||||
{
|
||||
return method_exists($this->adapter, 'getTemporaryUrl') || isset($this->temporaryUrlCallback);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a temporary URL for the file at the given path.
|
||||
*
|
||||
* @param string $path
|
||||
* @param \DateTimeInterface $expiration
|
||||
* @param array $options
|
||||
* @return string
|
||||
*
|
||||
* @throws \RuntimeException
|
||||
*/
|
||||
public function temporaryUrl($path, $expiration, array $options = [])
|
||||
{
|
||||
if (method_exists($this->adapter, 'getTemporaryUrl')) {
|
||||
return $this->adapter->getTemporaryUrl($path, $expiration, $options);
|
||||
}
|
||||
|
||||
if ($this->temporaryUrlCallback) {
|
||||
return $this->temporaryUrlCallback->bindTo($this, static::class)(
|
||||
$path, $expiration, $options
|
||||
);
|
||||
}
|
||||
|
||||
throw new RuntimeException('This driver does not support creating temporary URLs.');
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a temporary upload URL for the file at the given path.
|
||||
*
|
||||
* @param string $path
|
||||
* @param \DateTimeInterface $expiration
|
||||
* @param array $options
|
||||
* @return array
|
||||
*
|
||||
* @throws \RuntimeException
|
||||
*/
|
||||
public function temporaryUploadUrl($path, $expiration, array $options = [])
|
||||
{
|
||||
if (method_exists($this->adapter, 'temporaryUploadUrl')) {
|
||||
return $this->adapter->temporaryUploadUrl($path, $expiration, $options);
|
||||
}
|
||||
|
||||
throw new RuntimeException('This driver does not support creating temporary upload URLs.');
|
||||
}
|
||||
|
||||
/**
|
||||
* Concatenate a path to a URL.
|
||||
*
|
||||
* @param string $url
|
||||
* @param string $path
|
||||
* @return string
|
||||
*/
|
||||
protected function concatPathToUrl($url, $path)
|
||||
{
|
||||
return rtrim($url, '/').'/'.ltrim($path, '/');
|
||||
}
|
||||
|
||||
/**
|
||||
* Replace the scheme, host and port of the given UriInterface with values from the given URL.
|
||||
*
|
||||
* @param \Psr\Http\Message\UriInterface $uri
|
||||
* @param string $url
|
||||
* @return \Psr\Http\Message\UriInterface
|
||||
*/
|
||||
protected function replaceBaseUrl($uri, $url)
|
||||
{
|
||||
$parsed = parse_url($url);
|
||||
|
||||
return $uri
|
||||
->withScheme($parsed['scheme'])
|
||||
->withHost($parsed['host'])
|
||||
->withPort($parsed['port'] ?? null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get an array of all files in a directory.
|
||||
*
|
||||
* @param string|null $directory
|
||||
* @param bool $recursive
|
||||
* @return array
|
||||
*/
|
||||
public function files($directory = null, $recursive = false)
|
||||
{
|
||||
return $this->driver->listContents($directory ?? '', $recursive)
|
||||
->filter(function (StorageAttributes $attributes) {
|
||||
return $attributes->isFile();
|
||||
})
|
||||
->sortByPath()
|
||||
->map(function (StorageAttributes $attributes) {
|
||||
return $attributes->path();
|
||||
})
|
||||
->toArray();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all of the files from the given directory (recursive).
|
||||
*
|
||||
* @param string|null $directory
|
||||
* @return array
|
||||
*/
|
||||
public function allFiles($directory = null)
|
||||
{
|
||||
return $this->files($directory, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all of the directories within a given directory.
|
||||
*
|
||||
* @param string|null $directory
|
||||
* @param bool $recursive
|
||||
* @return array
|
||||
*/
|
||||
public function directories($directory = null, $recursive = false)
|
||||
{
|
||||
return $this->driver->listContents($directory ?? '', $recursive)
|
||||
->filter(function (StorageAttributes $attributes) {
|
||||
return $attributes->isDir();
|
||||
})
|
||||
->map(function (StorageAttributes $attributes) {
|
||||
return $attributes->path();
|
||||
})
|
||||
->toArray();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all the directories within a given directory (recursive).
|
||||
*
|
||||
* @param string|null $directory
|
||||
* @return array
|
||||
*/
|
||||
public function allDirectories($directory = null)
|
||||
{
|
||||
return $this->directories($directory, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a directory.
|
||||
*
|
||||
* @param string $path
|
||||
* @return bool
|
||||
*/
|
||||
public function makeDirectory($path)
|
||||
{
|
||||
try {
|
||||
$this->driver->createDirectory($path);
|
||||
} catch (UnableToCreateDirectory|UnableToSetVisibility $e) {
|
||||
throw_if($this->throwsExceptions(), $e);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Recursively delete a directory.
|
||||
*
|
||||
* @param string $directory
|
||||
* @return bool
|
||||
*/
|
||||
public function deleteDirectory($directory)
|
||||
{
|
||||
try {
|
||||
$this->driver->deleteDirectory($directory);
|
||||
} catch (UnableToDeleteDirectory $e) {
|
||||
throw_if($this->throwsExceptions(), $e);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the Flysystem driver.
|
||||
*
|
||||
* @return \League\Flysystem\FilesystemOperator
|
||||
*/
|
||||
public function getDriver()
|
||||
{
|
||||
return $this->driver;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the Flysystem adapter.
|
||||
*
|
||||
* @return \League\Flysystem\FilesystemAdapter
|
||||
*/
|
||||
public function getAdapter()
|
||||
{
|
||||
return $this->adapter;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the configuration values.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getConfig()
|
||||
{
|
||||
return $this->config;
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse the given visibility value.
|
||||
*
|
||||
* @param string|null $visibility
|
||||
* @return string|null
|
||||
*
|
||||
* @throws \InvalidArgumentException
|
||||
*/
|
||||
protected function parseVisibility($visibility)
|
||||
{
|
||||
if (is_null($visibility)) {
|
||||
return;
|
||||
}
|
||||
|
||||
return match ($visibility) {
|
||||
FilesystemContract::VISIBILITY_PUBLIC => Visibility::PUBLIC,
|
||||
FilesystemContract::VISIBILITY_PRIVATE => Visibility::PRIVATE,
|
||||
default => throw new InvalidArgumentException("Unknown visibility: {$visibility}."),
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Define a custom temporary URL builder callback.
|
||||
*
|
||||
* @param \Closure $callback
|
||||
* @return void
|
||||
*/
|
||||
public function buildTemporaryUrlsUsing(Closure $callback)
|
||||
{
|
||||
$this->temporaryUrlCallback = $callback;
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine if Flysystem exceptions should be thrown.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
protected function throwsExceptions(): bool
|
||||
{
|
||||
return (bool) ($this->config['throw'] ?? false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Pass dynamic methods call onto Flysystem.
|
||||
*
|
||||
* @param string $method
|
||||
* @param array $parameters
|
||||
* @return mixed
|
||||
*
|
||||
* @throws \BadMethodCallException
|
||||
*/
|
||||
public function __call($method, $parameters)
|
||||
{
|
||||
if (static::hasMacro($method)) {
|
||||
return $this->macroCall($method, $parameters);
|
||||
}
|
||||
|
||||
return $this->driver->{$method}(...$parameters);
|
||||
}
|
||||
}
|
440
vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemManager.php
vendored
Normal file
440
vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemManager.php
vendored
Normal file
@ -0,0 +1,440 @@
|
||||
<?php
|
||||
|
||||
namespace Illuminate\Filesystem;
|
||||
|
||||
use Aws\S3\S3Client;
|
||||
use Closure;
|
||||
use Illuminate\Contracts\Filesystem\Factory as FactoryContract;
|
||||
use Illuminate\Support\Arr;
|
||||
use InvalidArgumentException;
|
||||
use League\Flysystem\AwsS3V3\AwsS3V3Adapter as S3Adapter;
|
||||
use League\Flysystem\AwsS3V3\PortableVisibilityConverter as AwsS3PortableVisibilityConverter;
|
||||
use League\Flysystem\Filesystem as Flysystem;
|
||||
use League\Flysystem\FilesystemAdapter as FlysystemAdapter;
|
||||
use League\Flysystem\Ftp\FtpAdapter;
|
||||
use League\Flysystem\Ftp\FtpConnectionOptions;
|
||||
use League\Flysystem\Local\LocalFilesystemAdapter as LocalAdapter;
|
||||
use League\Flysystem\PathPrefixing\PathPrefixedAdapter;
|
||||
use League\Flysystem\PhpseclibV3\SftpAdapter;
|
||||
use League\Flysystem\PhpseclibV3\SftpConnectionProvider;
|
||||
use League\Flysystem\ReadOnly\ReadOnlyFilesystemAdapter;
|
||||
use League\Flysystem\UnixVisibility\PortableVisibilityConverter;
|
||||
use League\Flysystem\Visibility;
|
||||
|
||||
/**
|
||||
* @mixin \Illuminate\Contracts\Filesystem\Filesystem
|
||||
* @mixin \Illuminate\Filesystem\FilesystemAdapter
|
||||
*/
|
||||
class FilesystemManager implements FactoryContract
|
||||
{
|
||||
/**
|
||||
* The application instance.
|
||||
*
|
||||
* @var \Illuminate\Contracts\Foundation\Application
|
||||
*/
|
||||
protected $app;
|
||||
|
||||
/**
|
||||
* The array of resolved filesystem drivers.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $disks = [];
|
||||
|
||||
/**
|
||||
* The registered custom driver creators.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $customCreators = [];
|
||||
|
||||
/**
|
||||
* Create a new filesystem manager instance.
|
||||
*
|
||||
* @param \Illuminate\Contracts\Foundation\Application $app
|
||||
* @return void
|
||||
*/
|
||||
public function __construct($app)
|
||||
{
|
||||
$this->app = $app;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a filesystem instance.
|
||||
*
|
||||
* @param string|null $name
|
||||
* @return \Illuminate\Contracts\Filesystem\Filesystem
|
||||
*/
|
||||
public function drive($name = null)
|
||||
{
|
||||
return $this->disk($name);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a filesystem instance.
|
||||
*
|
||||
* @param string|null $name
|
||||
* @return \Illuminate\Contracts\Filesystem\Filesystem
|
||||
*/
|
||||
public function disk($name = null)
|
||||
{
|
||||
$name = $name ?: $this->getDefaultDriver();
|
||||
|
||||
return $this->disks[$name] = $this->get($name);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a default cloud filesystem instance.
|
||||
*
|
||||
* @return \Illuminate\Contracts\Filesystem\Cloud
|
||||
*/
|
||||
public function cloud()
|
||||
{
|
||||
$name = $this->getDefaultCloudDriver();
|
||||
|
||||
return $this->disks[$name] = $this->get($name);
|
||||
}
|
||||
|
||||
/**
|
||||
* Build an on-demand disk.
|
||||
*
|
||||
* @param string|array $config
|
||||
* @return \Illuminate\Contracts\Filesystem\Filesystem
|
||||
*/
|
||||
public function build($config)
|
||||
{
|
||||
return $this->resolve('ondemand', is_array($config) ? $config : [
|
||||
'driver' => 'local',
|
||||
'root' => $config,
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Attempt to get the disk from the local cache.
|
||||
*
|
||||
* @param string $name
|
||||
* @return \Illuminate\Contracts\Filesystem\Filesystem
|
||||
*/
|
||||
protected function get($name)
|
||||
{
|
||||
return $this->disks[$name] ?? $this->resolve($name);
|
||||
}
|
||||
|
||||
/**
|
||||
* Resolve the given disk.
|
||||
*
|
||||
* @param string $name
|
||||
* @param array|null $config
|
||||
* @return \Illuminate\Contracts\Filesystem\Filesystem
|
||||
*
|
||||
* @throws \InvalidArgumentException
|
||||
*/
|
||||
protected function resolve($name, $config = null)
|
||||
{
|
||||
$config ??= $this->getConfig($name);
|
||||
|
||||
if (empty($config['driver'])) {
|
||||
throw new InvalidArgumentException("Disk [{$name}] does not have a configured driver.");
|
||||
}
|
||||
|
||||
$name = $config['driver'];
|
||||
|
||||
if (isset($this->customCreators[$name])) {
|
||||
return $this->callCustomCreator($config);
|
||||
}
|
||||
|
||||
$driverMethod = 'create'.ucfirst($name).'Driver';
|
||||
|
||||
if (! method_exists($this, $driverMethod)) {
|
||||
throw new InvalidArgumentException("Driver [{$name}] is not supported.");
|
||||
}
|
||||
|
||||
return $this->{$driverMethod}($config);
|
||||
}
|
||||
|
||||
/**
|
||||
* Call a custom driver creator.
|
||||
*
|
||||
* @param array $config
|
||||
* @return \Illuminate\Contracts\Filesystem\Filesystem
|
||||
*/
|
||||
protected function callCustomCreator(array $config)
|
||||
{
|
||||
return $this->customCreators[$config['driver']]($this->app, $config);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create an instance of the local driver.
|
||||
*
|
||||
* @param array $config
|
||||
* @return \Illuminate\Contracts\Filesystem\Filesystem
|
||||
*/
|
||||
public function createLocalDriver(array $config)
|
||||
{
|
||||
$visibility = PortableVisibilityConverter::fromArray(
|
||||
$config['permissions'] ?? [],
|
||||
$config['directory_visibility'] ?? $config['visibility'] ?? Visibility::PRIVATE
|
||||
);
|
||||
|
||||
$links = ($config['links'] ?? null) === 'skip'
|
||||
? LocalAdapter::SKIP_LINKS
|
||||
: LocalAdapter::DISALLOW_LINKS;
|
||||
|
||||
$adapter = new LocalAdapter(
|
||||
$config['root'], $visibility, $config['lock'] ?? LOCK_EX, $links
|
||||
);
|
||||
|
||||
return new FilesystemAdapter($this->createFlysystem($adapter, $config), $adapter, $config);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create an instance of the ftp driver.
|
||||
*
|
||||
* @param array $config
|
||||
* @return \Illuminate\Contracts\Filesystem\Filesystem
|
||||
*/
|
||||
public function createFtpDriver(array $config)
|
||||
{
|
||||
if (! isset($config['root'])) {
|
||||
$config['root'] = '';
|
||||
}
|
||||
|
||||
$adapter = new FtpAdapter(FtpConnectionOptions::fromArray($config));
|
||||
|
||||
return new FilesystemAdapter($this->createFlysystem($adapter, $config), $adapter, $config);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create an instance of the sftp driver.
|
||||
*
|
||||
* @param array $config
|
||||
* @return \Illuminate\Contracts\Filesystem\Filesystem
|
||||
*/
|
||||
public function createSftpDriver(array $config)
|
||||
{
|
||||
$provider = SftpConnectionProvider::fromArray($config);
|
||||
|
||||
$root = $config['root'] ?? '/';
|
||||
|
||||
$visibility = PortableVisibilityConverter::fromArray(
|
||||
$config['permissions'] ?? []
|
||||
);
|
||||
|
||||
$adapter = new SftpAdapter($provider, $root, $visibility);
|
||||
|
||||
return new FilesystemAdapter($this->createFlysystem($adapter, $config), $adapter, $config);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create an instance of the Amazon S3 driver.
|
||||
*
|
||||
* @param array $config
|
||||
* @return \Illuminate\Contracts\Filesystem\Cloud
|
||||
*/
|
||||
public function createS3Driver(array $config)
|
||||
{
|
||||
$s3Config = $this->formatS3Config($config);
|
||||
|
||||
$root = (string) ($s3Config['root'] ?? '');
|
||||
|
||||
$visibility = new AwsS3PortableVisibilityConverter(
|
||||
$config['visibility'] ?? Visibility::PUBLIC
|
||||
);
|
||||
|
||||
$streamReads = $s3Config['stream_reads'] ?? false;
|
||||
|
||||
$client = new S3Client($s3Config);
|
||||
|
||||
$adapter = new S3Adapter($client, $s3Config['bucket'], $root, $visibility, null, $config['options'] ?? [], $streamReads);
|
||||
|
||||
return new AwsS3V3Adapter(
|
||||
$this->createFlysystem($adapter, $config), $adapter, $s3Config, $client
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Format the given S3 configuration with the default options.
|
||||
*
|
||||
* @param array $config
|
||||
* @return array
|
||||
*/
|
||||
protected function formatS3Config(array $config)
|
||||
{
|
||||
$config += ['version' => 'latest'];
|
||||
|
||||
if (! empty($config['key']) && ! empty($config['secret'])) {
|
||||
$config['credentials'] = Arr::only($config, ['key', 'secret']);
|
||||
}
|
||||
|
||||
if (! empty($config['token'])) {
|
||||
$config['credentials']['token'] = $config['token'];
|
||||
}
|
||||
|
||||
return Arr::except($config, ['token']);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a scoped driver.
|
||||
*
|
||||
* @param array $config
|
||||
* @return \Illuminate\Contracts\Filesystem\Filesystem
|
||||
*/
|
||||
public function createScopedDriver(array $config)
|
||||
{
|
||||
if (empty($config['disk'])) {
|
||||
throw new InvalidArgumentException('Scoped disk is missing "disk" configuration option.');
|
||||
} elseif (empty($config['prefix'])) {
|
||||
throw new InvalidArgumentException('Scoped disk is missing "prefix" configuration option.');
|
||||
}
|
||||
|
||||
return $this->build(tap(
|
||||
is_string($config['disk']) ? $this->getConfig($config['disk']) : $config['disk'],
|
||||
function (&$parent) use ($config) {
|
||||
$parent['prefix'] = $config['prefix'];
|
||||
|
||||
if (isset($config['visibility'])) {
|
||||
$parent['visibility'] = $config['visibility'];
|
||||
}
|
||||
}
|
||||
));
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a Flysystem instance with the given adapter.
|
||||
*
|
||||
* @param \League\Flysystem\FilesystemAdapter $adapter
|
||||
* @param array $config
|
||||
* @return \League\Flysystem\FilesystemOperator
|
||||
*/
|
||||
protected function createFlysystem(FlysystemAdapter $adapter, array $config)
|
||||
{
|
||||
if ($config['read-only'] ?? false === true) {
|
||||
$adapter = new ReadOnlyFilesystemAdapter($adapter);
|
||||
}
|
||||
|
||||
if (! empty($config['prefix'])) {
|
||||
$adapter = new PathPrefixedAdapter($adapter, $config['prefix']);
|
||||
}
|
||||
|
||||
return new Flysystem($adapter, Arr::only($config, [
|
||||
'directory_visibility',
|
||||
'disable_asserts',
|
||||
'retain_visibility',
|
||||
'temporary_url',
|
||||
'url',
|
||||
'visibility',
|
||||
]));
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the given disk instance.
|
||||
*
|
||||
* @param string $name
|
||||
* @param mixed $disk
|
||||
* @return $this
|
||||
*/
|
||||
public function set($name, $disk)
|
||||
{
|
||||
$this->disks[$name] = $disk;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the filesystem connection configuration.
|
||||
*
|
||||
* @param string $name
|
||||
* @return array
|
||||
*/
|
||||
protected function getConfig($name)
|
||||
{
|
||||
return $this->app['config']["filesystems.disks.{$name}"] ?: [];
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the default driver name.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getDefaultDriver()
|
||||
{
|
||||
return $this->app['config']['filesystems.default'];
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the default cloud driver name.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getDefaultCloudDriver()
|
||||
{
|
||||
return $this->app['config']['filesystems.cloud'] ?? 's3';
|
||||
}
|
||||
|
||||
/**
|
||||
* Unset the given disk instances.
|
||||
*
|
||||
* @param array|string $disk
|
||||
* @return $this
|
||||
*/
|
||||
public function forgetDisk($disk)
|
||||
{
|
||||
foreach ((array) $disk as $diskName) {
|
||||
unset($this->disks[$diskName]);
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Disconnect the given disk and remove from local cache.
|
||||
*
|
||||
* @param string|null $name
|
||||
* @return void
|
||||
*/
|
||||
public function purge($name = null)
|
||||
{
|
||||
$name ??= $this->getDefaultDriver();
|
||||
|
||||
unset($this->disks[$name]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Register a custom driver creator Closure.
|
||||
*
|
||||
* @param string $driver
|
||||
* @param \Closure $callback
|
||||
* @return $this
|
||||
*/
|
||||
public function extend($driver, Closure $callback)
|
||||
{
|
||||
$this->customCreators[$driver] = $callback;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the application instance used by the manager.
|
||||
*
|
||||
* @param \Illuminate\Contracts\Foundation\Application $app
|
||||
* @return $this
|
||||
*/
|
||||
public function setApplication($app)
|
||||
{
|
||||
$this->app = $app;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Dynamically call the default driver instance.
|
||||
*
|
||||
* @param string $method
|
||||
* @param array $parameters
|
||||
* @return mixed
|
||||
*/
|
||||
public function __call($method, $parameters)
|
||||
{
|
||||
return $this->disk()->$method(...$parameters);
|
||||
}
|
||||
}
|
82
vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemServiceProvider.php
vendored
Normal file
82
vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemServiceProvider.php
vendored
Normal file
@ -0,0 +1,82 @@
|
||||
<?php
|
||||
|
||||
namespace Illuminate\Filesystem;
|
||||
|
||||
use Illuminate\Support\ServiceProvider;
|
||||
|
||||
class FilesystemServiceProvider extends ServiceProvider
|
||||
{
|
||||
/**
|
||||
* Register the service provider.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function register()
|
||||
{
|
||||
$this->registerNativeFilesystem();
|
||||
|
||||
$this->registerFlysystem();
|
||||
}
|
||||
|
||||
/**
|
||||
* Register the native filesystem implementation.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
protected function registerNativeFilesystem()
|
||||
{
|
||||
$this->app->singleton('files', function () {
|
||||
return new Filesystem;
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Register the driver based filesystem.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
protected function registerFlysystem()
|
||||
{
|
||||
$this->registerManager();
|
||||
|
||||
$this->app->singleton('filesystem.disk', function ($app) {
|
||||
return $app['filesystem']->disk($this->getDefaultDriver());
|
||||
});
|
||||
|
||||
$this->app->singleton('filesystem.cloud', function ($app) {
|
||||
return $app['filesystem']->disk($this->getCloudDriver());
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Register the filesystem manager.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
protected function registerManager()
|
||||
{
|
||||
$this->app->singleton('filesystem', function ($app) {
|
||||
return new FilesystemManager($app);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the default file driver.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function getDefaultDriver()
|
||||
{
|
||||
return $this->app['config']['filesystems.default'];
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the default cloud based file driver.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function getCloudDriver()
|
||||
{
|
||||
return $this->app['config']['filesystems.cloud'];
|
||||
}
|
||||
}
|
21
vendor/laravel/framework/src/Illuminate/Filesystem/LICENSE.md
vendored
Normal file
21
vendor/laravel/framework/src/Illuminate/Filesystem/LICENSE.md
vendored
Normal file
@ -0,0 +1,21 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) Taylor Otwell
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
189
vendor/laravel/framework/src/Illuminate/Filesystem/LockableFile.php
vendored
Normal file
189
vendor/laravel/framework/src/Illuminate/Filesystem/LockableFile.php
vendored
Normal file
@ -0,0 +1,189 @@
|
||||
<?php
|
||||
|
||||
namespace Illuminate\Filesystem;
|
||||
|
||||
use Illuminate\Contracts\Filesystem\LockTimeoutException;
|
||||
|
||||
class LockableFile
|
||||
{
|
||||
/**
|
||||
* The file resource.
|
||||
*
|
||||
* @var resource
|
||||
*/
|
||||
protected $handle;
|
||||
|
||||
/**
|
||||
* The file path.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $path;
|
||||
|
||||
/**
|
||||
* Indicates if the file is locked.
|
||||
*
|
||||
* @var bool
|
||||
*/
|
||||
protected $isLocked = false;
|
||||
|
||||
/**
|
||||
* Create a new File instance.
|
||||
*
|
||||
* @param string $path
|
||||
* @param string $mode
|
||||
* @return void
|
||||
*/
|
||||
public function __construct($path, $mode)
|
||||
{
|
||||
$this->path = $path;
|
||||
|
||||
$this->ensureDirectoryExists($path);
|
||||
$this->createResource($path, $mode);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create the file's directory if necessary.
|
||||
*
|
||||
* @param string $path
|
||||
* @return void
|
||||
*/
|
||||
protected function ensureDirectoryExists($path)
|
||||
{
|
||||
if (! file_exists(dirname($path))) {
|
||||
@mkdir(dirname($path), 0777, true);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Create the file resource.
|
||||
*
|
||||
* @param string $path
|
||||
* @param string $mode
|
||||
* @return void
|
||||
*
|
||||
* @throws \Exception
|
||||
*/
|
||||
protected function createResource($path, $mode)
|
||||
{
|
||||
$this->handle = fopen($path, $mode);
|
||||
}
|
||||
|
||||
/**
|
||||
* Read the file contents.
|
||||
*
|
||||
* @param int|null $length
|
||||
* @return string
|
||||
*/
|
||||
public function read($length = null)
|
||||
{
|
||||
clearstatcache(true, $this->path);
|
||||
|
||||
return fread($this->handle, $length ?? ($this->size() ?: 1));
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the file size.
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public function size()
|
||||
{
|
||||
return filesize($this->path);
|
||||
}
|
||||
|
||||
/**
|
||||
* Write to the file.
|
||||
*
|
||||
* @param string $contents
|
||||
* @return $this
|
||||
*/
|
||||
public function write($contents)
|
||||
{
|
||||
fwrite($this->handle, $contents);
|
||||
|
||||
fflush($this->handle);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Truncate the file.
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function truncate()
|
||||
{
|
||||
rewind($this->handle);
|
||||
|
||||
ftruncate($this->handle, 0);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a shared lock on the file.
|
||||
*
|
||||
* @param bool $block
|
||||
* @return $this
|
||||
*
|
||||
* @throws \Illuminate\Contracts\Filesystem\LockTimeoutException
|
||||
*/
|
||||
public function getSharedLock($block = false)
|
||||
{
|
||||
if (! flock($this->handle, LOCK_SH | ($block ? 0 : LOCK_NB))) {
|
||||
throw new LockTimeoutException("Unable to acquire file lock at path [{$this->path}].");
|
||||
}
|
||||
|
||||
$this->isLocked = true;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get an exclusive lock on the file.
|
||||
*
|
||||
* @param bool $block
|
||||
* @return bool
|
||||
*
|
||||
* @throws \Illuminate\Contracts\Filesystem\LockTimeoutException
|
||||
*/
|
||||
public function getExclusiveLock($block = false)
|
||||
{
|
||||
if (! flock($this->handle, LOCK_EX | ($block ? 0 : LOCK_NB))) {
|
||||
throw new LockTimeoutException("Unable to acquire file lock at path [{$this->path}].");
|
||||
}
|
||||
|
||||
$this->isLocked = true;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Release the lock on the file.
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function releaseLock()
|
||||
{
|
||||
flock($this->handle, LOCK_UN);
|
||||
|
||||
$this->isLocked = false;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Close the file.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function close()
|
||||
{
|
||||
if ($this->isLocked) {
|
||||
$this->releaseLock();
|
||||
}
|
||||
|
||||
return fclose($this->handle);
|
||||
}
|
||||
}
|
54
vendor/laravel/framework/src/Illuminate/Filesystem/composer.json
vendored
Normal file
54
vendor/laravel/framework/src/Illuminate/Filesystem/composer.json
vendored
Normal file
@ -0,0 +1,54 @@
|
||||
{
|
||||
"name": "illuminate/filesystem",
|
||||
"description": "The Illuminate Filesystem package.",
|
||||
"license": "MIT",
|
||||
"homepage": "https://laravel.com",
|
||||
"support": {
|
||||
"issues": "https://github.com/laravel/framework/issues",
|
||||
"source": "https://github.com/laravel/framework"
|
||||
},
|
||||
"authors": [
|
||||
{
|
||||
"name": "Taylor Otwell",
|
||||
"email": "taylor@laravel.com"
|
||||
}
|
||||
],
|
||||
"require": {
|
||||
"php": "^8.1",
|
||||
"illuminate/collections": "^10.0",
|
||||
"illuminate/contracts": "^10.0",
|
||||
"illuminate/macroable": "^10.0",
|
||||
"illuminate/support": "^10.0",
|
||||
"symfony/finder": "^6.2"
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Illuminate\\Filesystem\\": ""
|
||||
},
|
||||
"files": [
|
||||
"functions.php"
|
||||
]
|
||||
},
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "10.x-dev"
|
||||
}
|
||||
},
|
||||
"suggest": {
|
||||
"ext-fileinfo": "Required to use the Filesystem class.",
|
||||
"ext-ftp": "Required to use the Flysystem FTP driver.",
|
||||
"ext-hash": "Required to use the Filesystem class.",
|
||||
"illuminate/http": "Required for handling uploaded files (^7.0).",
|
||||
"league/flysystem": "Required to use the Flysystem local driver (^3.0.16).",
|
||||
"league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (^3.0).",
|
||||
"league/flysystem-ftp": "Required to use the Flysystem FTP driver (^3.0).",
|
||||
"league/flysystem-sftp-v3": "Required to use the Flysystem SFTP driver (^3.0).",
|
||||
"psr/http-message": "Required to allow Storage::put to accept a StreamInterface (^1.0).",
|
||||
"symfony/filesystem": "Required to enable support for relative symbolic links (^6.2).",
|
||||
"symfony/mime": "Required to enable support for guessing extensions (^6.2)."
|
||||
},
|
||||
"config": {
|
||||
"sort-packages": true
|
||||
},
|
||||
"minimum-stability": "dev"
|
||||
}
|
25
vendor/laravel/framework/src/Illuminate/Filesystem/functions.php
vendored
Normal file
25
vendor/laravel/framework/src/Illuminate/Filesystem/functions.php
vendored
Normal file
@ -0,0 +1,25 @@
|
||||
<?php
|
||||
|
||||
namespace Illuminate\Filesystem;
|
||||
|
||||
if (! function_exists('Illuminate\Filesystem\join_paths')) {
|
||||
/**
|
||||
* Join the given paths together.
|
||||
*
|
||||
* @param string|null $basePath
|
||||
* @param string ...$paths
|
||||
* @return string
|
||||
*/
|
||||
function join_paths($basePath, ...$paths)
|
||||
{
|
||||
foreach ($paths as $index => $path) {
|
||||
if (empty($path)) {
|
||||
unset($paths[$index]);
|
||||
} else {
|
||||
$paths[$index] = DIRECTORY_SEPARATOR.ltrim($path, DIRECTORY_SEPARATOR);
|
||||
}
|
||||
}
|
||||
|
||||
return $basePath.implode('', $paths);
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user