Weave Code
Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Flysystem Laravel Package

league/flysystem

Flysystem is a PHP filesystem abstraction library offering one API for local and remote storage. Adapters let you read, write, and manage files on S3, FTP, SFTP, Dropbox, and more, so you can swap backends without rewriting application code.

View on GitHub
Deep Wiki
Context7

League Flysystem is a PHP filesystem abstraction library that provides a unified interface for interacting with local and remote filesystems. It decouples application code from storage implementations, letting you swap between local disks, cloud providers, or in-memory systems without rewriting logic. Widely adopted across the PHP ecosystem, Flysystem powers storage layers in frameworks like Laravel and is battle-tested in production.

  • Unified API for reading, writing, listing, and deleting files across backends
  • Pluggable adapters for local, SFTP, AWS S3, FTP, and more
  • Path-safe operations with sanitization built in
  • Caching decorators to reduce redundant remote calls
  • Framework-agnostic design with strong PSR interoperability
Frequently asked questions about Flysystem
Is league/flysystem already included in Laravel, or do I need to install it?
Laravel's Storage facade already delegates to Flysystem 3, so most Laravel applications do not need to add the core package just for local or S3 storage. You should still pin league/flysystem and any adapter packages explicitly in composer.json instead of relying on transitive resolution through laravel/framework. Adapter packages for FTP, SFTP, Azure, Google Cloud, and similar backends are opt-in and must be required separately.
How do I install Flysystem with Amazon S3 in a Laravel app?
Require the appropriate S3 adapter package, such as league/flysystem-aws-s3-v3, and configure the disk in config/filesystems.php. If you need custom adapter construction, register it through Storage::extend() and keep that wiring in a service provider or config layer. Avoid scattering S3-specific options through controllers, and test upload and download paths with Storage::fake() or an in-memory adapter.
Does Flysystem support SFTP, FTP, WebDAV, Azure Blob Storage, and Google Cloud Storage?
Yes, but support is split into separate adapter packages rather than bundled into the core. Examples include league/flysystem-ftp, league/flysystem-sftp-v3, league/flysystem-webdav, league/flysystem-azure-blob-storage, and league/flysystem-google-cloud-storage. This keeps the installed footprint opt-in, but you must verify that the specific adapter supports the features you need, such as temporary URLs, checksums, and visibility handling.
Which Laravel and PHP versions does league/flysystem support?
Laravel currently integrates Flysystem 3 through its Storage facade, so that is the relevant major version for most Laravel projects. Exact PHP version constraints depend on the Flysystem release tag and the adapter packages you install. The supplied release date appears stale, so confirm the latest tag on Packagist and verify it resolves cleanly against your pinned Laravel and PHP versions before upgrading.
How can I test file uploads and downloads without hitting real storage?
Use InMemoryFilesystemAdapter or Laravel's Storage::fake() to exercise upload, download, exists, and delete paths in CI without real credentials. StaticInMemoryAdapterRegistry can help when you need predictable in-memory adapter instances across tests. This makes storage tests fast and deterministic, but you should still add a small integration check against the real backend for adapter-specific behavior.
Why does my Flysystem code behave differently on S3 than on a local disk?
S3 directories are prefixes rather than real directories, and visibility, ACLs, temporary URLs, and checksum support vary by adapter. Code written against local filesystem semantics can behave differently on S3 without failing loudly. Abstract these capability differences behind your own interface and test the specific adapter behavior you depend on.
Can I restrict Flysystem to a subdirectory or make a filesystem read-only?
Yes, Flysystem provides decorators for this: PathPrefixedAdapter can isolate tenants or restrict operations to a path prefix, and ReadonlyFilesystemAdapter can protect archival or export volumes. MountManager is useful when one operation must reach multiple disks. Keep this cross-cutting behavior in decorators or service configuration rather than in controllers.
Is league/flysystem maintained and safe to use in production?
Flysystem is MIT-licensed, widely used, and powers Laravel's filesystem layer, so it is a reasonable production dependency. However, the assessment notes single-maintainer concentration risk and unreliable metadata such as dependents and release date, so verify the current release and downstream usage on Packagist. Pin versions, own your upgrade runbook, and avoid depending on adapter-specific behavior without tests.
How should I migrate existing Storage:: calls to Flysystem behind an interface?
Use a strangler pattern rather than a big-bang rewrite. Introduce an internal FileStore interface with read, write, url, exists, and delete methods, then reimplement the existing local disk behind that seam and migrate call sites gradually. Keep adapter construction centralized in config/filesystems.php and service providers so application code does not leak adapter-specific configuration.
What are the alternatives to Flysystem for filesystem abstraction in Laravel?
For most Laravel applications, Laravel's Storage facade is already the Flysystem abstraction, so replacing it usually adds work without benefit. You could call cloud SDKs directly, but you would lose the consistent API, testability, and adapter swapping that Flysystem provides. If you only need local files, native PHP functions are possible, but Laravel Storage is still the more consistent option for application code.
Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
pharaonic/laravel-notification-dependencies
beautinow/translug
dev-brainiac/bot-cloaked
octoberrain/html
octoberrain/extension
octoberrain/exception
octoberrain/contracts
frankyso/ipaymu
3mdikram/worldmoneywords
snowsoft/config
itmosoft/laravel-subscriptions
larva/laravel-ai-qwen
adachsoft/api-version-bundle
cgv/localized-resource
noith/settings
kda/laravel-package
kda/filament-dynamic-navigation
bypersoft/signbox
pairus/product-data
fayne/laravel-filament-cms-core