使用PHP的Amazon S3 copyObject

时间:2014-04-27 20:36:28

标签: php amazon-web-services amazon-s3

我正在尝试将1TB文件从一个存储桶复制到另一个存储桶。我知道如果我登录AWS S3面板可以轻松完成,但我想使用PHP来实现。

我使用以下AWS S3 class from github

public static function copyObject($srcBucket, $srcUri, $bucket, $uri, $acl = self::ACL_PRIVATE, $metaHeaders = array(), $requestHeaders = array(), $storageClass = self::STORAGE_CLASS_STANDARD)
    {
        $rest = new S3Request('PUT', $bucket, $uri, self::$endpoint);
        $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)
        {
            self::__triggerError(sprintf("S3::copyObject({$srcBucket}, {$srcUri}, {$bucket}, {$uri}): [%s] %s",
            $rest->error['code'], $rest->error['message']), __FILE__, __LINE__);
            return false;
        }
        return isset($rest->body->LastModified, $rest->body->ETag) ? array(
            'time' => strtotime((string)$rest->body->LastModified),
            'hash' => substr((string)$rest->body->ETag, 1, -1)
        ) : false;
    }

我在我的PHP代码中使用它如下:

$s3 = new S3(AWS_ACCESS_KEY, AWS_SECRET_KEY);
$s3->copyObject($srcBucket, $srcName, $bucketName, $saveName, S3::ACL_PUBLIC_READ_WRITE);

我没有得到error_log。我错过了什么,我想错了,拜托?

1 个答案:

答案 0 :(得分:1)

在1 TB时,对象太大而无法在单个操作中复制。引用S3 REST API documentation

  

您可以在Amazon S3中存储最多5 TB的单个对象。您可以使用此API在单个原子操作中创建最大为5 GB的对象副本。 但是,要复制大于5 GB的对象,您必须使用分段上传API。

不幸的是,您使用的S3类似乎不支持分段上传,因此您需要使用其他内容。我强烈建议您使用Amazon's AWS SDK for PHP - 它比您现在使用的更大,更复杂,但它支持整个S3 API(以及与其他AWS服务一样!),因此它能够处理此操作。