我正在尝试将1TB文件从一个存储桶复制到另一个存储桶。我知道如果我登录AWS S3面板可以轻松完成,但我想使用PHP来实现。
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。我错过了什么,我想错了,拜托?
答案 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服务一样!),因此它能够处理此操作。