How to copy files from S3 bucket to S3 bucket directly in PHP (AWS SDK for PHP)? I'm finding examples for Ruby, i.e.: https://stackoverflow.com/a/10418427/2899889 But I can not find a single example for php. Also I could not find methods copy_to() or copy_from() in AWS SDK for PHP - the commands used in Ruby examples?
-
I didn't see any examples after a quick search, but it appears that you should be able to use `CopyObject ( array $params = [] )` and follow that up with `PutObject ( array $params = [] )` https://docs.aws.amazon.com/AmazonS3/latest/userguide/copy-object.html – MattJamison Dec 06 '21 at 15:00
2 Answers
Refer to the AWS Github for Code Examples.
This is the 1st place you should when you want to learn how to perform tasks using the AWS SDK in a supported programming language.
Here are the PHP code examples for Amazon S3:
https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/php/example_code/s3
Here is an example of copying objects from aws-doc-sdk-examples/s3-copying-objects.php at main · awsdocs/aws-doc-sdk-examples · GitHub:
<?php
/**
* Copyright 2010-2019 Amazon.com, Inc. or its affiliates. All Rights Reserved.
*
* This file is licensed under the Apache License, Version 2.0 (the "License").
* You may not use this file except in compliance with the License. A copy of
* the License is located at
*
* http://aws.amazon.com/apache2.0/
*
* This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
* CONDITIONS OF ANY KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License.
*
* ABOUT THIS PHP SAMPLE: This sample is part of the SDK for PHP Developer Guide topic at
* https://docs.aws.amazon.com/sdk-for-php/v3/developer-guide/s3-examples-creating-buckets.html
*
*/
require 'vendor/autoload.php';
use Aws\S3\S3Client;
$sourceBucket = '*** Your Source Bucket Name ***';
$sourceKeyname = '*** Your Source Object Key ***';
$targetBucket = '*** Your Target Bucket Name ***';
$s3 = new S3Client([
'version' => 'latest',
'region' => 'us-east-1'
]);
// Copy an object.
$s3->copyObject([
'Bucket' => $targetBucket,
'Key' => "{$sourceKeyname}-copy",
'CopySource' => "{$sourceBucket}/{$sourceKeyname}",
]);
// Perform a batch of CopyObject operations.
$batch = array();
for ($i = 1; $i <= 3; $i++) {
$batch[] = $s3->getCommand('CopyObject', [
'Bucket' => $targetBucket,
'Key' => "{targetKeyname}-{$i}",
'CopySource' => "{$sourceBucket}/{$sourceKeyname}",
]);
}
try {
$results = CommandPool::batch($s3, $batch);
foreach($results as $result) {
if ($result instanceof ResultInterface) {
// Result handling here
}
if ($result instanceof AwsException) {
// AwsException handling here
}
}
} catch (\Exception $e) {
// General error handling here
}
Credential parameters can also be passed during creation of S3Client object like this:
$s3 = new S3Client([
'version' => 'latest',
'region' => 'us-east-1',
'credentials' => [
'key' => '**client key**',
'secret' => '**client secret**',
],
]);
-
Thanks. I found that one my self a bit later also. But somehow it's not complete. I don't see that account credentials are passed when S3 client is created. – MilanG Dec 08 '21 at 09:12
-
An addition - when S3Cclient object is created like this AWS will try to get credentials from .env variables. However, credentials can be passed as (in this case 3rd) parameter to constructor. – MilanG Dec 08 '21 at 10:21
Here is an function that does file copying, bucket to bucket:
function s3toS3FileCopy($sourceBucket, $sourceFilePath, $targetBucket, $targetFilePath) {
$env = getenv();
$s3 = new S3Client([
'version' => 'latest',
'region' => 'eu-central-1',
'credentials' => [
'key' => $env['S3_ACCESS_KEY'],
'secret' => $env['S3_SECRET_KEY'],
],
]);
$s3->copyObject([
'Bucket' => $targetBucket,
'Key' => $targetFilePath,
'CopySource' => "{$sourceBucket}/{$sourceFilePath}",
]);
}
'credentials' parameter array can be skipped if some other way is used. Also set the region parameter you need. Copying between different regions is not supported. It's simple, but parameters are no so intuitive.

- 6,994
- 2
- 35
- 64