Skip to content

Instantly share code, notes, and snippets.

@tillkruss
Last active April 6, 2020 08:28
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save tillkruss/4109aa3de72788f25b21699ff9023ecc to your computer and use it in GitHub Desktop.
Save tillkruss/4109aa3de72788f25b21699ff9023ecc to your computer and use it in GitHub Desktop.
Stream files from S3 as ZIP file.
<?php
use Aws\S3\S3Client;
use ZipStream\ZipStream; // https://github.com/maennchen/ZipStream-PHP
use GuzzleHttp\Client as HttpClient;
protected function streamAsZip($files)
{
$s3 = S3Client::factory('...');
$zip = new ZipStream("foobar.zip");
foreach ($files as $file) {
$request = $s3->createPresignedRequest(
$s3->getCommand('GetObject', [
'Key' => $file->path,
'Bucket' => 'bucket-name',
]),
'+20 seconds'
);
$tmpfile = tempnam(sys_get_temp_dir(), str_random());
(new HttpClient)->request('GET', (string) $request->getUri(), ['sink' => fopen($tmpfile, 'w+')]);
$fp = fopen($tmpfile, 'r');
$zip->addFileFromStream(basename($file->path), $fp);
fclose($fp);
}
$zip->finish();
}
@JacobBennett
Copy link

is this a Guzzle HttpClient?

@tillkruss
Copy link
Author

@JacobBennett: Yes, just added the missing import.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment