PHP S3 Examples
===============
+Installing AWS PHP SDK
+----------------------
+
+This installs AWS PHP SDK using composer (see here_ how to install composer).
+
+.. _here: https://getcomposer.org/download/
+
+.. code-block:: bash
+
+ $ composer install aws/aws-sdk-php
+
Creating a Connection
---------------------
This creates a connection so that you can interact with the server.
+.. note::
+
+ The client initialization requires a region so we use ``''``.
+
.. code-block:: php
<?php
+
+ use Aws\S3\S3Client;
+
define('AWS_KEY', 'place access key here');
define('AWS_SECRET_KEY', 'place secret key here');
- define('AWS_CANONICAL_ID', 'your DHO Username');
- define('AWS_CANONICAL_NAME', 'Also your DHO Username!');
- $HOST = 'objects.dreamhost.com';
+ $ENDPOINT = 'http://objects.dreamhost.com';
- // require the amazon sdk for php library
- require_once 'AWSSDKforPHP/sdk.class.php';
+ // require the amazon sdk from your composer vendor dir
+ require __DIR__.'/vendor/autoload.php';
// Instantiate the S3 class and point it at the desired host
- $Connection = new AmazonS3(array(
- 'key' => AWS_KEY,
- 'secret' => AWS_SECRET_KEY,
- 'canonical_id' => AWS_CANONICAL_ID,
- 'canonical_name' => AWS_CANONICAL_NAME,
- ));
- $Connection->set_hostname($HOST);
- $Connection->allow_hostname_override(false);
-
- // Set the S3 class to use objects.dreamhost.com/bucket
- // instead of bucket.objects.dreamhost.com
- $Connection->enable_path_style();
-
+ $client = new S3Client([
+ 'region' => '',
+ 'version' => '2006-03-01',
+ 'endpoint' => $ENDPOINT,
+ 'credentials' => [
+ 'key' => AWS_KEY,
+ 'secret' => AWS_SECRET_KEY
+ ],
+ // Set the S3 class to use objects.dreamhost.com/bucket
+ // instead of bucket.objects.dreamhost.com
+ 'use_path_style_endpoint' => true
+ ]);
Listing Owned Buckets
---------------------
-This gets a list of CFSimpleXML objects representing buckets that you
-own. This also prints out the bucket name and creation date of each
-bucket.
+This gets a ``AWS\Result`` instance that is more convenient to visit using array access way.
+This also prints out the bucket name and creation date of each bucket.
.. code-block:: php
<?php
- $ListResponse = $Connection->list_buckets();
- $Buckets = $ListResponse->body->Buckets->Bucket;
- foreach ($Buckets as $Bucket) {
- echo $Bucket->Name . "\t" . $Bucket->CreationDate . "\n";
+ $listResponse = $client->listBuckets();
+ $buckets = $listResponse['Buckets'];
+ foreach ($buckets as $bucket) {
+ echo $bucket['Name'] . "\t" . $bucket['CreationDate'] . "\n";
}
The output will look something like this::
-----------------
This creates a new bucket called ``my-new-bucket`` and returns a
-``CFResponse`` object.
-
-.. note::
-
- This command requires a region as the second argument,
- so we use ``AmazonS3::REGION_US_E1``, because this constant is ``''``
+``AWS\Result`` object.
.. code-block:: php
<?php
- $Connection->create_bucket('my-new-bucket', AmazonS3::REGION_US_E1);
+ $client->createBucket(['Bucket' => 'my-new-bucket']);
List a Bucket's Content
-----------------------
-This gets an array of ``CFSimpleXML`` objects representing the objects
-in the bucket. This then prints out each object's name, the file size,
-and last modified date.
+This gets a ``AWS\Result`` instance that is more convenient to visit using array access way.
+This then prints out each object's name, the file size, and last modified date.
.. code-block:: php
<?php
- $ObjectsListResponse = $Connection->list_objects($bucketname);
- $Objects = $ObjectsListResponse->body->Contents;
- foreach ($Objects as $Object) {
- echo $Object->Key . "\t" . $Object->Size . "\t" . $Object->LastModified . "\n";
+ $objectsListResponse = $client->listObjects(['Bucket' => $bucketname]);
+ $objects = $objectsListResponse['Contents'] ?? [];
+ foreach ($objects as $object) {
+ echo $object['Key'] . "\t" . $object['Size'] . "\t" . $object['LastModified'] . "\n";
}
.. note::
If there are more than 1000 objects in this bucket,
- you need to check $ObjectListResponse->body->isTruncated
+ you need to check $objectsListResponse['isTruncated']
and run again with the name of the last key listed.
Keep doing this until isTruncated is not true.
-----------------
This deletes the bucket called ``my-old-bucket`` and returns a
-``CFResponse`` object
+``AWS\Result`` object
.. note::
.. code-block:: php
<?php
- $Connection->delete_bucket('my-old-bucket');
-
-
-Forced Delete for Non-empty Buckets
------------------------------------
-
-This will delete the bucket even if it is not empty.
-
-.. code-block:: php
-
- <?php
- $Connection->delete_bucket('my-old-bucket', 1);
+ $client->deleteBucket(['Bucket' => 'my-old-bucket']);
Creating an Object
.. code-block:: php
<?php
- $Connection->create_object('my-bucket-name', 'hello.txt', array(
- 'body' => "Hello World!",
- ));
+ $client->putObject([
+ 'Bucket' => 'my-bucket-name',
+ 'Key' => 'hello.txt',
+ 'Body' => "Hello World!"
+ ]);
Change an Object's ACL
.. code-block:: php
<?php
- $Connection->set_object_acl('my-bucket-name', 'hello.txt', AmazonS3::ACL_PUBLIC);
- $Connection->set_object_acl('my-bucket-name', 'secret_plans.txt', AmazonS3::ACL_PRIVATE);
+ $client->putObjectAcl([
+ 'Bucket' => 'my-bucket-name',
+ 'Key' => 'hello.txt',
+ 'ACL' => 'public-read'
+ ]);
+ $client->putObjectAcl([
+ 'Bucket' => 'my-bucket-name',
+ 'Key' => 'secret_plans.txt',
+ 'ACL' => 'private'
+ ]);
Delete an Object
.. code-block:: php
<?php
- $Connection->delete_object('my-bucket-name', 'goodbye.txt');
+ $client->deleteObject(['Bucket' => 'my-bucket-name', 'Key' => 'goodbye.txt']);
Download an Object (to a file)
.. code-block:: php
<?php
- $FileHandle = fopen('/home/larry/documents/poetry.pdf', 'w+');
- $Connection->get_object('my-bucket-name', 'poetry.pdf', array(
- 'fileDownload' => $FileHandle,
- ));
-
+ $object = $client->getObject(['Bucket' => 'my-bucket-name', 'Key' => 'poetry.pdf']);
+ file_put_contents('/home/larry/documents/poetry.pdf', $object['Body']->getContents());
Generate Object Download URLs (signed and unsigned)
---------------------------------------------------
.. code-block:: php
<?php
- my $plans_url = $Connection->get_object_url('my-bucket-name', 'hello.txt');
- echo $plans_url . "\n";
- my $secret_url = $Connection->get_object_url('my-bucket-name', 'secret_plans.txt', '1 hour');
- echo $secret_url . "\n";
+ $hello_url = $client->getObjectUrl('my-bucket-name', 'hello.txt');
+ echo $hello_url."\n";
+
+ $secret_plans_cmd = $client->getCommand('GetObject', ['Bucket' => 'my-bucket-name', 'Key' => 'secret_plans.txt']);
+ $request = $client->createPresignedRequest($secret_plans_cmd, '+1 hour');
+ echo $request->getUri()."\n";
The output of this will look something like::
http://objects.dreamhost.com/my-bucket-name/hello.txt
- http://objects.dreamhost.com/my-bucket-name/secret_plans.txt?Signature=XXXXXXXXXXXXXXXXXXXXXXXXXXX&Expires=1316027075&AWSAccessKeyId=XXXXXXXXXXXXXXXXXXX
+ http://objects.dreamhost.com/my-bucket-name/secret_plans.txt?X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=sandboxAccessKey%2F20190116%2F%2Fs3%2Faws4_request&X-Amz-Date=20190116T125520Z&X-Amz-SignedHeaders=host&X-Amz-Expires=3600&X-Amz-Signature=61921f07c73d7695e47a2192cf55ae030f34c44c512b2160bb5a936b2b48d923