123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419 |
- <?php
- namespace common\modules\attachment\components;
- use common\modules\attachment\components\contracts\Cloud as CloudFilesystemContract;
- use common\modules\attachment\components\contracts\FileNotFoundException as ContractFileNotFoundException;
- use common\modules\attachment\components\contracts\Filesystem as FilesystemContract;
- use common\modules\attachment\components\contracts\ImageProcessor as ImageContract;
- use common\modules\attachment\components\flysystem\QiniuAdapter;
- use creocoder\flysystem\Filesystem;
- use InvalidArgumentException;
- use League\Flysystem\Adapter\Local as LocalAdapter;
- use League\Flysystem\AdapterInterface;
- use League\Flysystem\FileNotFoundException;
- use RuntimeException;
- class FilesystemAdapter implements FilesystemContract, CloudFilesystemContract, ImageContract
- {
- /**
- * The Flysystem filesystem implementation.
- *
- * @var Filesystem
- */
- protected $driver;
- /**
- * Create a new filesystem adapter instance.
- *
- * @param Filesystem $driver
- */
- public function __construct(Filesystem $driver)
- {
- $this->driver = $driver;
- }
- /**
- * Determine if a file exists.
- *
- * @param string $path
- * @return bool
- */
- public function exists($path)
- {
- return $this->driver->has($path);
- }
- /**
- * Get the contents of a file.
- *
- * @param string $path
- * @return string
- *
- * @throws \common\modules\attachment\components\contracts\FileNotFoundException
- */
- public function get($path)
- {
- try {
- return $this->driver->read($path);
- } catch (FileNotFoundException $e) {
- throw new ContractFileNotFoundException($path, $e->getCode(), $e);
- }
- }
- /**
- * Write the contents of a file.
- *
- * @param string $path
- * @param string|resource|UploadedFile $contents
- * @param array $options
- * @return bool
- */
- public function put($path, $contents, $options = [])
- {
- if (is_string($options)) {
- $options = ['visibility' => $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 UploadedFile) {
- return $this->putFile($path, $contents, $options);
- }
- return is_resource($contents)
- ? $this->driver->putStream($path, $contents, $options)
- : $this->driver->put($path, $contents, $options);
- }
- /**
- * Store the uploaded file on the disk.
- *
- * @param string $path
- * @param UploadedFile $file
- * @param array $options
- * @return string|false
- */
- public function putFile($path, $file, $options = [])
- {
- return $this->putFileAs($path, $file, $file->getHashName(), $options);
- }
- /**
- * Store the uploaded file on the disk with a given name.
- *
- * @param string $path
- * @param UploadedFile $file
- * @param string $name
- * @param array $options
- * @return string|false
- */
- public function putFileAs($path, $file, $name, $options = [])
- {
- // $stream = fopen($file->tempName, 'r+');
- $stream = file_get_contents($file->tempName);
- // 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->getVisibility($path) == AdapterInterface::VISIBILITY_PUBLIC) {
- return FilesystemContract::VISIBILITY_PUBLIC;
- }
- return FilesystemContract::VISIBILITY_PRIVATE;
- }
- /**
- * Set the visibility for the given path.
- *
- * @param string $path
- * @param string $visibility
- * @return void
- */
- public function setVisibility($path, $visibility)
- {
- return $this->driver->setVisibility($path, $this->parseVisibility($visibility));
- }
- /**
- * Prepend to a file.
- *
- * @param string $path
- * @param string $data
- * @param string $separator
- * @return int
- */
- public function prepend($path, $data, $separator = PHP_EOL)
- {
- if ($this->exists($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 int
- */
- public function append($path, $data, $separator = PHP_EOL)
- {
- if ($this->exists($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 {
- if (! $this->driver->delete($path)) {
- $success = false;
- }
- } catch (FileNotFoundException $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)
- {
- return $this->driver->copy($from, $to);
- }
- /**
- * Move a file to a new location.
- *
- * @param string $from
- * @param string $to
- * @return bool
- */
- public function move($from, $to)
- {
- return $this->driver->rename($from, $to);
- }
- /**
- * Get the file size of a given file.
- *
- * @param string $path
- * @return int
- */
- public function size($path)
- {
- return $this->driver->getSize($path);
- }
- /**
- * Get the mime-type of a given file.
- *
- * @param string $path
- * @return string|false
- */
- public function mimeType($path)
- {
- return $this->driver->getMimetype($path);
- }
- /**
- * Get the file's last modification time.
- *
- * @param string $path
- * @return int
- */
- public function lastModified($path)
- {
- return $this->driver->getTimestamp($path);
- }
- /**
- * Get the URL for the file at the given path.
- *
- * @param string $path
- * @return string
- */
- public function getUrl($path)
- {
- $adapter = $this->driver->getAdapter();
- if (method_exists($adapter, 'getUrl')) {
- return $adapter->getUrl($path);
- } elseif ($adapter instanceof QiniuAdapter) {
- return $this->getQiniuUrl($adapter, $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 QiniuAdapter $adapter
- * @param string $path
- * @return string
- */
- protected function getQiniuUrl($adapter, $path)
- {
- return $adapter->getUrl($path);
- }
- /**
- * Get the URL for the file at the given path.
- *
- * @param string $path
- * @return string
- */
- protected function getLocalUrl($path)
- {
- $url = $this->driver->url;
- return rtrim($url, '/').'/'.ltrim($path, '/');
- }
- public function thumbnail($path, $width, $height)
- {
- $adapter = $this->driver->getAdapter();
- if (method_exists($adapter, 'thumbnail')) {
- try {
- return $adapter->thumbnail($path, $width, $height);
- } catch(\Exception $e) {
- return $path;
- }
- } else {
- throw new RuntimeException('This driver does not support thumbnail');
- }
- }
- public function crop($path, $width, $height, array $start = [0, 0])
- {
- $adapter = $this->driver->getAdapter();
- if (method_exists($adapter, 'crop')) {
- try {
- return $adapter->crop($path, $width, $height, $start);
- } catch(\Exception $e) {
- return $path;
- }
- } else {
- throw new RuntimeException('This driver does not support crop');
- }
- }
- /**
- * Create a directory.
- *
- * @param string $path
- * @return bool
- */
- public function makeDirectory($path)
- {
- return $this->driver->createDir($path);
- }
- /**
- * Recursively delete a directory.
- *
- * @param string $directory
- * @return bool
- */
- public function deleteDirectory($directory)
- {
- return $this->driver->deleteDir($directory);
- }
- /**
- * Get the Flysystem driver.
- *
- * @return Filesystem
- */
- public function getDriver()
- {
- return $this->driver;
- }
- /**
- * Parse the given visibility value.
- *
- * @param string|null $visibility
- * @return string|null
- *
- * @throws \InvalidArgumentException
- */
- protected function parseVisibility($visibility)
- {
- if (is_null($visibility)) {
- return;
- }
- switch ($visibility) {
- case FilesystemContract::VISIBILITY_PUBLIC:
- return AdapterInterface::VISIBILITY_PUBLIC;
- case FilesystemContract::VISIBILITY_PRIVATE:
- return AdapterInterface::VISIBILITY_PRIVATE;
- }
- throw new InvalidArgumentException('Unknown visibility: '.$visibility);
- }
- /**
- * Pass dynamic methods call onto Flysystem.
- *
- * @param string $method
- * @param array $parameters
- * @return mixed
- *
- * @throws \BadMethodCallException
- */
- public function __call($method, array $parameters)
- {
- return call_user_func_array([$this->driver, $method], $parameters);
- }
- }
|