繁体   English   中英

使用PHP的Amazon S3 copyObject

[英]Amazon S3 copyObject using PHP

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

我正在使用来自github的以下AWS S3类

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 TB时,对象太大,无法在单个操作中复制。 引用S3 REST API文档

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

不幸的是,您使用的S3类似乎并不支持分段上传,因此您需要使用其他内容。 我强烈建议您使用适用于PHP的亚马逊AWS开发工具包 -它比您现在使用的工具更大,更复杂,但是它支持整个S3 API(以及其他AWS服务!),因此它将能够处理此操作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM