<?php
namespace Aws\S3;
use Aws\Credentials\CredentialsInterface;
use GuzzleHttp\Psr7\Uri;
/**
* Encapsulates the logic for getting the data for an S3 object POST upload form
*
* @link http://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPOST.html
*/
class PostObject
{
private $client;
private $bucket;
private $formAttributes;
private $formInputs;
private $jsonPolicy;
/**
* Constructs the PostObject.
*
* @param S3Client $client Client used with the POST object
* @param string $bucket Bucket to use
* @param array $formInputs Associative array of form input fields.
* @param string|array $jsonPolicy JSON encoded POST policy document. The
* policy will be base64 encoded and applied
* to the form on your behalf.
*/
public function __construct(
S3Client $client,
$bucket,
array $formInputs,
$jsonPolicy
) {
$this->client = $client;
$this->bucket = $bucket;
if (is_array($jsonPolicy)) {
$jsonPolicy = json_encode($jsonPolicy);
}
$this->jsonPolicy = $jsonPolicy;
$this->formAttributes = [
'action' => $this->generateUri(),
'method' => 'POST',
'enctype' => 'multipart/form-data'
];
$this->formInputs = $formInputs + ['key' => '${filename}'];
$credentials = $client->getCredentials()->wait();
$this->formInputs += $this->getPolicyAndSignature($credentials);
}
/**
* Gets the S3 client.
*
* @return S3Client
*/
public function getClient()
{
return $this->client;
}
/**
* Gets the bucket name.
*
* @return string
*/
public function getBucket()
{
return $this->bucket;
}
/**
* Gets the form attributes as an array.
*
* @return array
*/
public function getFormAttributes()
{
return $this->formAttributes;
}
/**
* Set a form attribute.
*
* @param string $attribute Form attribute to set.
* @param string $value Value to set.
*/
public function setFormAttribute($attribute, $value)
{
$this->formAttributes[$attribute] = $value;
}
/**
* Gets the form inputs as an array.
*
* @return array
*/
public function getFormInputs()
{
return $this->formInputs;
}
/**
* Set a form input.
*
* @param string $field Field name to set
* @param string $value Value to set.
*/
public function setFormInput($field, $value)
{
$this->formInputs[$field] = $value;
}
/**
* Gets the raw JSON policy.
*
* @return string
*/
public function getJsonPolicy()
{
return $this->jsonPolicy;
}
private function generateUri()
{
$uri = new Uri($this->client->getEndpoint());
if ($uri->getScheme() === 'https'
&& strpos($this->bucket, '.') !== false
) {
// Use path-style URLs
$uri = $uri->withPath($this->bucket);
} else {
// Use virtual-style URLs
$uri = $uri->withHost($this->bucket . '.' . $uri->getHost());
}
return (string) $uri;
}
protected function getPolicyAndSignature(CredentialsInterface $creds)
{
$jsonPolicy64 = base64_encode($this->jsonPolicy);
return [
'AWSAccessKeyId' => $creds->getAccessKeyId(),
'policy' => $jsonPolicy64,
'signature' => base64_encode(hash_hmac(
'sha1',
$jsonPolicy64,
$creds->getSecretKey(),
true
))
];
}
}
|