| 
<?php
 namespace JLaso\S3Wrapper;
 
 class S3Wrapper
 {
 /** @var string  */
 protected $bucket;
 /** @var \Aws\S3\S3Client */
 protected $s3Client = null;
 /** @var string  */
 protected $lastRemoteFile = "";
 /** @var S3Wrapper */
 protected static $instance = null;
 
 /**
 * @param string $accessKeyId
 * @param string $secretAccessKey
 * @param string $bucket
 */
 function __construct($accessKeyId, $secretAccessKey, $bucket)
 {
 $this->bucket = $bucket;
 
 $this->s3Client = \Aws\S3\S3Client::factory(array(
 'key' => $accessKeyId,
 'secret' => $secretAccessKey,
 'signature' => 'v4',
 'region' => 'eu-central-1',
 ));
 
 self::$instance = $this;
 }
 
 /**
 * @return S3Wrapper
 * @throws \Exception
 */
 public static function getInstance()
 {
 if (!self::$instance) {
 if (!file_exists(__DIR__.'/config.ini')){
 throw new \Exception("Unable to create S3Wrapper instance without config.ini file. Please copy config.ini.sample to config.ini and fill in your AWS S3 access data");
 }
 $config = parse_ini_file(__DIR__.'/config.ini', true);
 $config = $config["s3"];
 new S3Wrapper($config["access_key_id"], $config["secret_access_key"], $config["bucket"]);
 }
 
 return self::$instance;
 }
 
 /**
 * @param string $localFile
 * @param string $remoteFile
 * @param int $perm
 * @return string
 */
 function getFileIfNewest($localFile, $remoteFile, $perm = 0777)
 {
 $this->lastRemoteFile = $remoteFile;
 $download = false;
 if (!file_exists($localFile)) {
 $download = true;
 } else {
 $iterator = $this->s3Client->getIterator('ListObjects', array(
 'Bucket' => $this->bucket,
 'Prefix' => $remoteFile,
 'Delimiter' => '/',
 ));
 
 foreach ($iterator as $object) {
 $remoteDate = date("U", strtotime($object['LastModified']));
 $localDate = filemtime($localFile);
 
 if ($remoteDate > $localDate) {
 $download = true;
 }
 break;
 }
 }
 
 if ($download) {
 try {
 $result = $this->s3Client->getObject(array(
 'Bucket' => $this->bucket,
 'Key' => $remoteFile,
 ));
 } catch (\Exception $e) {
 error_log("Error recovering $remoteFile from S3: ".$e->getMessage());
 return null;
 }
 
 file_put_contents($localFile, $result['Body']);
 chmod($localFile, $perm);
 touch($localFile, strtotime($result['LastModified']));
 }
 
 return $localFile;
 }
 
 /**
 * @param string $remoteFile
 * @param string $content
 */
 function saveFile($remoteFile, $content)
 {
 $this->lastRemoteFile = $remoteFile;
 $this->s3Client->upload($this->bucket, $remoteFile, $content);
 }
 
 /**
 * @return string
 */
 public function getLastRemoteFile()
 {
 return $this->lastRemoteFile;
 }
 
 /**
 * @param string $path
 * @return array
 */
 public function getFilesList($path = "")
 {
 $files = array();
 $options = array(
 'Bucket' => $this->bucket,
 );
 if ($path){
 $options['Prefix'] = $path;
 $options['Delimiter'] = '/';
 }
 $iterator = $this->s3Client->getIterator('ListObjects', $options);
 
 foreach ($iterator as $object) {
 
 $files[] = array(
 'timestamp' => date("U", strtotime($object['LastModified'])),
 'filename' => $object['Key'],
 );
 }
 
 return $files;
 }
 
 /**
 * @return mixed
 */
 public function listBuckets()
 {
 $buckets = $this->s3Client->listBuckets();
 
 return $buckets["Buckets"];
 }
 
 /**
 * @param string $localFile
 * @param string $remoteFile
 */
 public function deleteFile($localFile, $remoteFile)
 {
 @unlink($localFile);
 
 $this->s3Client->deleteObject(array(
 'Bucket' => $this->bucket,
 'Key' => $remoteFile,
 ));
 }
 
 }
 |