Die beste Lösung aus meiner Erfahrung ist die Verwendung von aws-sdk-php für den Zugriff auf Objekte in S3 über einen s3client mit aktiviertem registerStreamWrapper(). Verwenden Sie dann fopen, um Objekte aus S3 zu streamen, und leiten Sie diesen Stream direkt an die Funktion addFileFromStream() von ZipStream weiter, damit ZipStream sie von dort übernehmen kann. Kein ZipArchive, kein großer Speicheraufwand, kein Erstellen von ZIP auf dem Server oder Duplizieren von Dateien aus S3 auf dem Webserver, um anschließend eine Zip-Datei zu streamen.
So:
//...
$s3Client->registerStreamWrapper(); //required
//test files on s3
$s3keys = array(
"ziptestfolder/file1.txt",
"ziptestfolder/file2.txt"
);
// Define suitable options for ZipStream Archive.
$opt = array(
'comment' => 'test zip file.',
'content_type' => 'application/octet-stream'
);
//initialise zipstream with output zip filename and options.
$zip = new ZipStream\ZipStream('test.zip', $opt);
//loop keys useful for multiple files
foreach ($s3keys as $key) {
// Get the file name in S3 key so we can save it to the zip
//file using the same name.
$fileName = basename($key);
//concatenate s3path.
$bucket = 'bucketname';
$s3path = "s3://" . $bucket . "/" . $key;
//addFileFromStream
if ($streamRead = fopen($s3path, 'r')) {
$zip->addFileFromStream($fileName, $streamRead);
} else {
die('Could not open stream for reading');
}
}
$zip->finish();
Und wenn Sie ZipStream in einem Symfony Controller-Aktion verwenden, diese Antwort sehen zu: https://stackoverflow.com/a/44706446/136151
Wenn jemand Abstimmung ist unten bitte auch Ihr Grund in Kommentare hinzufügen. –
Ich habe versucht, Hilfe zu diesem Thema zu finden! Wäre hilfreich, wenn jemand aufgrund seiner Erfahrung vorschlagen könnte !! – jas
Ich habe es gesehen und Ihnen eine Lösung gegeben. – Forer