Oft will man ja beim Speichern von Dateien flexibel bleiben. Beim Entwickeln lokal speichern, im Produktivsystem in S3 und auf einem alten Test-System vielleicht noch auf einem FTP-Server oder in Redis.
Jeder hat schon mal so was geschrieben um wenigstens das native Filesystem und FTP zu abstrahieren, weil der FTP-Server nur vom produktiven System aus zu erreichen war oder so. Mein PHP Framework hat auch solche Klassen. Aber ich hatte keine Lust mehr diese noch mal anzupassen und eine brauchbare Struktur mit Factory und Interfaces dort endlich mal zu implementieren... was die Klassen (2006 geschrieben) an sich dringend nötig hätten.
Deswegen habe ich mich einige Sekunden im Internet umgeguckt und
Flysystem gefunden. Das kann natives FS, FTP, S3, Redis, OneDrive, Azure File Storage.... also alles was man so braucht.
Ich habe es mal mit S3 getestet. Natürlich müsste man sich erst einmal eine brauchbare Factory schreiben, aber da kann man sicher in seinem System auf die alten Strukturen zurück greifen und muss dann nicht alles umbauen, wenn man auf Flysystem wechselt.
Flysystem installieren für PHP:
php composer.phar require league/flysystem
php composer.phar require league/flysystem-aws-s3-v3
Meine test.php:
<?php
require 'vendor/autoload.php';
use League\Flysystem\AwsS3v3\AwsS3Adapter;
use League\Flysystem\Filesystem;
if(file_exists('./testdata/down.png')){
unlink('./testdata/down.png');
}
$s3 = new Aws\S3\S3Client([
'version' => 'latest',
'region' => 'us-east-1',
'endpoint' => 'http://localhost:9080',
'use_path_style_endpoint' => true,
'credentials' => [
'key' => 'AKIAIOSFODNN7EXAMPLE',
'secret' => 'wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY',
],
]);
//use headBucket for exists-check
try{
$s3->createBucket([
'Bucket' => 'testimagebucket'
]);
$s3->waitUntil('BucketExists', ['Bucket' => 'testimagebucket']);
}
catch(Exception $e){
echo $e->getMessage();
}
$adapter = new AwsS3Adapter($s3, 'testimagebucket');
$filesystem = new Filesystem($adapter);
try{
$filesystem->writeStream('image01', fopen('./testdata/test_01.png', 'r'));
echo "Update\n";
file_put_contents('./testdata/down.png', $filesystem->readStream('image01'));
echo "Download\n";
$filesystem->delete('image01');
echo "Delete\n";
}
catch(Exception $e){
echo $e->getMessage();
}
try{
$s3->deleteBucket(['Bucket' => 'testimagebucket']);
}
catch(Exception $e){
echo $e->getMessage();
}
Mit dem
Local-Adapter kann man das dann schnell für eine lokale Speicherung umbauen.