/** * Copy an object * * @param string $bucket Source bucket name * @param string $uri Source object URI * @param string $bucket Destination bucket name * @param string $uri Destination object URI * @param constant $acl ACL constant * @param array $metaHeaders Optional array of x-amz-meta-* headers * @param array $requestHeaders Optional array of request headers (content type, disposition, etc.) * @param constant $storageClass Storage class constant * @return mixed | false */ public static function copyObject($srcBucket, $srcUri, $bucket, $uri, $acl = self::ACL_PRIVATE, $metaHeaders = array(), $requestHeaders = array(), $storageClass = self::STORAGE_CLASS_STANDARD) { $rest = new AEUtilsS3Request('PUT', $bucket, $uri, AEUtilAmazons3::getInstance()->defaultHost); $rest->setHeader('Content-Length', 0); foreach ($requestHeaders as $h => $v) { $rest->setHeader($h, $v); } foreach ($metaHeaders as $h => $v) { $rest->setAmzHeader('x-amz-meta-' . $h, $v); } if ($storageClass !== self::STORAGE_CLASS_STANDARD) { // Storage class $rest->setAmzHeader('x-amz-storage-class', $storageClass); } $rest->setAmzHeader('x-amz-acl', $acl); $rest->setAmzHeader('x-amz-copy-source', sprintf('/%s/%s', $srcBucket, rawurlencode($srcUri))); if (sizeof($requestHeaders) > 0 || sizeof($metaHeaders) > 0) { $rest->setAmzHeader('x-amz-metadata-directive', 'REPLACE'); } $rest = $rest->getResponse(); if ($rest->error === false && $rest->code !== 200) { $rest->error = array('code' => $rest->code, 'message' => 'Unexpected HTTP status'); } if ($rest->error !== false) { $o = self::getInstance(); $o->setWarning(sprintf(__CLASS__ . "::copyObject({$srcBucket}, {$srcUri}, {$bucket}, {$uri}): [%s] %s", $rest->error['code'], $rest->error['message'])); return false; } return true; }
/** * Get an object * * @param string $bucket Bucket name * @param string $uri Object URI * @param mixed $saveTo Filename or resource to write to * @return mixed */ public static function getObject($bucket, $uri, $saveTo = false, $from = null, $to = null) { $rest = new AEUtilsS3Request('GET', $bucket, $uri, AEUtilAmazons3::getInstance()->defaultHost); if ($saveTo !== false) { if (is_resource($saveTo)) { $rest->fp = $saveTo; } else { if (($rest->fp = @fopen($saveTo, 'wb')) !== false) { $rest->file = realpath($saveTo); } else { $rest->response->error = array('code' => 0, 'message' => 'Unable to open save file for writing: ' . $saveTo); } } } if ($rest->response->error === false) { // Set the range header if (!empty($from) && !empty($to)) { $rest->setHeader('Range', "bytes={$from}-{$to}"); } $rest->getResponse(); } if ($rest->response->error === false && ($rest->response->code !== 200 && $rest->response->code !== 206)) { $rest->response->error = array('code' => $rest->response->code, 'message' => 'Unexpected HTTP status'); } if ($rest->response->error !== false) { $o = self::getInstance(); $o->setWarning(sprintf(__CLASS__ . "::getObject({$bucket}, {$uri}): [%s] %s", $rest->response->error['code'], $rest->response->error['message'])); return false; } return true; }