/** * Copy Object action * * This implementation of the PUT operation creates a copy of an object that is already stored in Amazon S3. * A PUT copy operation is the same as performing a GET and then a PUT * * @param string $scrBucketName Source bucket name. * @param string $srcObject Source object name. * @param string $destBucketName Destination bucket name. * @param string $destObject Destination object name. * @param array $requestHeaders optional Request headers array looks like array(header => value) * @param string $versionId optional Specifies source version id. * @return CopyObjectResponseData Returns CopyObjectResponseData * @throws ClientException * @throws S3Exception */ public function copyObject($scrBucketName, $srcObject, $destBucketName, $destObject, array $requestHeaders = null, $versionId = null) { $result = null; $options = array('_subdomain' => (string) $destBucketName, 'x-amz-copy-source' => sprintf("/%s/%s" . ($versionId !== null ? "?versionId=%s" : ''), $scrBucketName, self::escapeObjectName($srcObject), self::escape($versionId))); $allowedHeaders = array('x-amz-metadata-directive', 'x-amz-copy-source-if-match', 'x-amz-copy-source-if-none-match', 'x-amz-copy-source-if-unmodified-since', 'x-amz-copy-source-if-modified-since', 'x-amz-server-side-encryption', 'x-amz-storage-class', 'x-amz-website-redirect-location'); $allowedHeaders = array_merge($allowedHeaders, self::$xamzAclAllowedHeaders); if (!empty($requestHeaders)) { $requestHeaders = $this->getFilteredArray($allowedHeaders, $requestHeaders); $options = array_merge($options, $requestHeaders); } $response = $this->getClient()->call('PUT', $options, sprintf('/%s', self::escapeObjectName($destObject))); if ($response->getError() === false) { $sxml = simplexml_load_string($response->getRawContent()); $result = new CopyObjectResponseData(); $result->setS3($this->s3); $result->setBucketName((string) $destBucketName)->setObjectName((string) $destObject)->setHeaders($response->getHeaders())->setETag((string) $sxml->ETag)->setLastModified(new DateTime((string) $sxml->LastModified, new DateTimeZone('UTC'))); } return $result; }