【问题标题】:How to update object properties in a AWS S3 Bucket如何更新 AWS S3 存储桶中的对象属性
【发布时间】:2020-09-21 03:03:12
【问题描述】:

我已将近 25k 文件(大型媒体文件)上传到 s3 存储桶。我使用 AWS SDK2 for PHP (S3Client::putObject) 执行上传。现在,我需要更新这些文件的元数据,即将 ContentDisposition 更改为附件并分配文件名。

有没有不需要重新上传文件的方法来执行此操作?请帮忙。

【问题讨论】:

  • 您找到解决方案了吗?我看到的唯一接近的是copyObject
  • @dsummersl 是的,据我所知,copyObject 是唯一的出路。

标签: php amazon-s3


【解决方案1】:

是的,您可以使用copyObject method,将CopySource 参数设置为等于BucketKey 参数。

例子:

// setup your $s3 connection, and define the bucket and key for your resource.
$s3->copyObject(array(
  'Bucket' => $bucket,
  'CopySource' => "$bucket/$key",
  'Key' => $key,
  'Metadata' => array(
    'ExtraHeader' => 'HEADER VALUE'
  ),
  'MetadataDirective' => 'REPLACE'
));

【讨论】:

  • 我没有尝试过 CopySource。所以,我必须先复制一份,然后删除旧的。我要试试这个。
  • 好的。最后,这里是我如何混合使用 copyObject 和 deleteObject 来实现目标。 1. 将带有更新元标记的原始对象复制到临时文件夹。 2. 取出原件。 3. 将 temp 复制到原始位置。 4. 从临时位置删除副本。对于这么简单的事情,付出了太多的努力。不幸的是,PHP SDK 没有替代方法。
【解决方案2】:

更新 S3 对象上的缓存控制元数据

<?php
define('S3_BUCKET', 'bucket-name');
define('S3_ACCESS_KEY', 'your-access-key');
define('S3_SECRET_KEY', 'secret-key');
define('S3_REGION', 'ap-south-1'); //Mumbai

require 'vendors/aws/aws-autoloader.php';

use Aws\S3\S3Client;
use Aws\S3\Exception\S3Exception;

try {
    $s3 = S3Client::factory(array(
                'version' => 'latest',
                'region' => S3_REGION,
                'credentials' => array(
                    'secret' => S3_SECRET_KEY,
                    'key' => S3_ACCESS_KEY,
                )
    ));

    $objects = $this->s3->getIterator('ListObjects', array('Bucket' => S3_BUCKET));

    echo "Keys retrieved!\n";
    foreach ($objects as $object) {
        echo $object['Key'] . "\n";
        $s3->copyObject(array(
            'Bucket' => S3_BUCKET,
            'CopySource' => S3_BUCKET . '/' . $object['Key'],
            'Key' => $key,
            'ContentType' => 'image/jpeg',
            'ACL' => 'public-read',
            'StorageClass' => 'REDUCED_REDUNDANCY',
            'CacheControl' => 'max-age=172800',
            'MetadataDirective' => 'REPLACE'
        ));
    }
} catch (S3Exception $e) {
    echo $e->getMessage() . "\n";
}

【讨论】:

  • 它与当前答案有何不同?
【解决方案3】:

试试这个

用于删除现有对象

$keyname = 'product-file/my-object1.dll';
try
{
  $delete = $this->s3->deleteObject([
    'Bucket' => 'belisc',
    'Key'    => $keyname
  ]);

  if ($delete['DeleteMarker']){
    return true;
  } else {
    return false;
  }
}
catch (S3Exception $e) {
  return $e->getAwsErrorMessage();
}

用于检查对象

如果对象仍然存在,则返回 true

$keyname = 'product-file/my-object1.dll';
try {
  $this->s3->getObject([
    'Bucket' => 'belisc',
    'Key'    => $keyname
  ]);

  return true;
} catch (S3Exception $e) {
  return $e->getAwsErrorMessage();
}

然后你就可以上传新的了

try {
  return $this->s3->putObject([
    'Bucket' => 'belisc',
    'Key'    => 'product-file/MiFlashSetup_eng.rar',
    'SourceFile' => 'c:\MiFlashSetup_eng.rar'
  ]);
} catch (S3Exception $e) {
  die("There was an error uploading the file. ".$e->getAwsErrorMessage());
}

【讨论】:

    猜你喜欢
    • 2017-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-23
    • 2018-05-05
    • 2018-12-08
    • 1970-01-01
    • 2019-10-24
    相关资源
    最近更新 更多