Skip to content

Instantly share code, notes, and snippets.

@SkydGit
Created September 1, 2017 08:01
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save SkydGit/f4097b7c29137431880a94ccbe31c9c5 to your computer and use it in GitHub Desktop.
Save SkydGit/f4097b7c29137431880a94ccbe31c9c5 to your computer and use it in GitHub Desktop.
A simple Symfony Service to Upload Files to Amazon S3
<?php
namespace Acme\DemoBundle\Services;
use Aws\S3\S3Client;
/**
* Class AmazonS3Service
*
* @package Acme\DemoBundle\Service
*/
class AmazonS3Service
{
/**
* @var S3Client
*/
private $client;
/**
* @var string
*/
private $bucket;
/**
* @param string $bucket
* @param array $s3arguments
*/
public function __construct($bucket, array $s3arguments)
{
$this->setBucket($bucket);
$this->setClient(new S3Client($s3arguments));
}
/**
* @param string $fileName
* @param string $content
* @param array $meta
* @param string $privacy
* @return string file url
*/
public function upload( $fileName, $content, array $meta = [], $privacy = 'public-read')
{
return $this->getClient()->upload($this->getBucket(), $fileName, $content, $privacy, [
'Metadata' => $meta
])->toArray()['ObjectURL'];
}
/**
* @param string $fileName
* @param string|null $newFilename
* @param array $meta
* @param string $privacy
* @return string file url
*/
public function uploadFile($fileName, $newFilename = null, array $meta = [], $privacy = 'public-read') {
if(!$newFilename) {
$newFilename = basename($fileName);
}
if(!isset($meta['contentType'])) {
// Detect Mime Type
$mimeTypeHandler = finfo_open(FILEINFO_MIME_TYPE);
$meta['contentType'] = finfo_file($mimeTypeHandler, $fileName);
finfo_close($mimeTypeHandler);
}
return $this->upload($newFilename, file_get_contents($fileName), $meta, $privacy);
}
/**
* Getter of client
*
* @return S3Client
*/
protected function getClient()
{
return $this->client;
}
/**
* Setter of client
*
* @param S3Client $client
*
* @return $this
*/
private function setClient(S3Client $client)
{
$this->client = $client;
return $this;
}
/**
* Getter of bucket
*
* @return string
*/
protected function getBucket()
{
return $this->bucket;
}
/**
* Setter of bucket
*
* @param string $bucket
*
* @return $this
*/
private function setBucket($bucket)
{
$this->bucket = $bucket;
return $this;
}
}
php composer.phar require "aws/aws-sdk-php"
# This file is auto-generated during the composer install
parameters:
....
amazon_key:
amazon_secret:
services:
....
demo_storage:
class: Acme\DemoBundle\Service\AmazonS3Service
arguments:
- "demo" # Name of Bucket
- credentials:
key: "%amazon_key%"
secret: "%amazon_secret%"
region: "eu-central-1" # Region of Bucket
version: "2006-03-01" # API Version
<?php
$storage = $this->getContainer()->get('demo_storage');
// Upload a file with the content "content text" and the MIME-Type text/plain
$storage->upload('test.txt', 'content text', ['contentType' => 'text/plain']);
// Upload a local existing File and let the service automatically detect the mime type.
$storage->uploadFile('file path' . 'demo.pdf');
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment