league/flysystem-rackspace
Flysystem adapter for Rackspace Cloud Files. Adds a Rackspace-backed filesystem driver so you can use Flysystem’s unified API to read, write, list, move, and delete files in Cloud Files containers, integrating with PHP apps via League/Flysystem.
Install the Package
composer require league/flysystem-rackspace
Ensure league/flysystem is installed (required dependency).
Configure Laravel Filesystem
Add to config/filesystems.php:
'disks' => [
'rackspace' => [
'driver' => 'custom',
'adapter' => League\Flysystem\Rackspace\RackspaceAdapter::class,
'options' => [
'username' => env('RACKSPACE_USERNAME'),
'apiKey' => env('RACKSPACE_API_KEY'),
'region' => env('RACKSPACE_REGION', 'IAD'),
'container' => env('RACKSPACE_CONTAINER'),
],
],
],
Bind to Laravel Storage
In AppServiceProvider@boot():
Storage::extend('rackspace', function ($app) {
$config = config('filesystems.disks.rackspace');
$adapter = new League\Flysystem\Rackspace\RackspaceAdapter(
$config['options']['username'],
$config['options']['apiKey'],
$config['options']['region'],
$config['options']['container']
);
return Storage::build([
'driver' => 'league-flysystem',
'adapter' => $adapter,
]);
});
First Use Case: Upload and Retrieve
// Upload
Storage::disk('rackspace')->put('file.txt', 'Hello Rackspace!');
// Download
$contents = Storage::disk('rackspace')->get('file.txt');
Basic CRUD Operations
// Upload from string
Storage::disk('rackspace')->put('file.txt', 'Content');
// Upload from file path
Storage::disk('rackspace')->putFile('folder', '/local/path/file.txt');
// Download to string
$content = Storage::disk('rackspace')->get('file.txt');
// Download to file
Storage::disk('rackspace')->download('file.txt', '/local/path/download.txt');
// Delete
Storage::disk('rackspace')->delete('file.txt');
Directory Operations
// List contents (handles pagination for >10K files)
$files = Storage::disk('rackspace')->files();
$directories = Storage::disk('rackspace')->directories();
// Create directory
Storage::disk('rackspace')->makeDirectory('folder');
// Delete directory (recursively)
Storage::disk('rackspace')->deleteDirectory('folder');
Metadata Handling
// Get file metadata
$metadata = Storage::disk('rackspace')->metadata('file.txt');
// Update metadata (if supported by Rackspace)
Storage::disk('rackspace')->updateMetadata('file.txt', ['customKey' => 'value']);
Streaming Large Files
// Stream upload
$stream = fopen('/local/large-file.zip', 'r');
Storage::disk('rackspace')->writeStream('large-file.zip', $stream);
fclose($stream);
// Stream download
$stream = Storage::disk('rackspace')->readStream('large-file.zip');
file_put_contents('/local/download.zip', $stream);
Laravel Facade Usage
Leverage Laravel’s Storage facade for consistency:
// Upload user avatar
$path = $request->file('avatar')->store('avatars', 'rackspace');
// Generate shared URL (if needed, requires Rackspace SDK)
$url = Storage::disk('rackspace')->getAdapter()->getClient()->getObjectUrl(...);
Service Layer Abstraction Create a service to encapsulate Rackspace logic:
class RackspaceStorageService {
protected $disk;
public function __construct() {
$this->disk = Storage::disk('rackspace');
}
public function uploadUserMedia($userId, $file) {
$path = "users/{$userId}/{$file->hashName()}";
return $this->disk->putFileAs('public', $file, $path);
}
}
Fallback Mechanism Implement a fallback to local storage:
try {
return Storage::disk('rackspace')->get($path);
} catch (\Exception $e) {
return Storage::disk('local')->get($path);
}
Event-Based Workflows Use Laravel events for post-upload actions:
Storage::disk('rackspace')->put($path, $content);
event(new FileUploaded($path, 'rackspace'));
Configuration Management
Centralize credentials in .env:
RACKSPACE_USERNAME=your_username
RACKSPACE_API_KEY=your_api_key
RACKSPACE_REGION=IAD
RACKSPACE_CONTAINER=your_container
API Version Mismatch
10,000-File Limit
listContents() defaults to a 10,000-file limit. The package fixes this, but large directories may still require manual pagination.listContents() with custom markers for deep pagination:
$files = [];
$marker = null;
do {
$contents = Storage::disk('rackspace')->listContents($marker);
$files = array_merge($files, $contents);
$marker = end($contents)->path();
} while ($marker);
Credential Handling
.env and never log sensitive data:
\Log::debug('Using Rackspace container: ' . env('RACKSPACE_CONTAINER'));
PHP Version Conflicts
// Add to composer.json
"config": {
"platform": {
"php": "7.4"
}
}
Connection Timeouts
$adapter = new RackspaceAdapter([...], [
'timeout' => 60,
]);
Enable Verbose Logging
$adapter = new RackspaceAdapter([...]);
$adapter->getClient()->setDebug(true);
Inspect Raw API Responses
$client = Storage::disk('rackspace')->getAdapter()->getClient();
$response = $client->listObjects();
\Log::debug($response->getBody());
Test with Minimal Buckets
Check for Deprecated Methods
// Old (may not work)
$filesystem->read('file');
// New
$filesystem->readStream('file')->getContents();
Custom Metadata Handling Extend the adapter to support custom metadata:
class ExtendedRackspaceAdapter extends League\Flysystem\Rackspace\RackspaceAdapter {
public function setCustomMetadata($path, array $metadata) {
$object = $this->getClient()->getObject($this->container, $path);
$object->setMetadata($metadata);
$object->update();
}
}
Shared Links Generation Add shared URL generation (requires Rackspace SDK):
$adapter = new RackspaceAdapter([...]);
$client = $adapter->getClient();
$url = $client->getObjectUrl($container, $path, ['expires' => time() + 3600]);
Event Dispatching Wrap the adapter to dispatch events:
class EventfulRackspaceAdapter extends League\Flysystem\Rackspace\RackspaceAdapter {
public function write($path, $contents, Config $config) {
event(new FileUploading($path, $contents));
parent::write($path, $contents, $config);
event(new FileUploaded($path));
}
}
Fallback to Local Storage Implement a hybrid
How can I help you explore Laravel packages today?