在PHP中使用s3服务器端加密

在PHP中使用s3服务器端加密,php,api,amazon-s3,Php,Api,Amazon S3,我已经决定利用amazons新的服务器端加密与s3,但是,我遇到了一个问题,我无法解决 我使用的是在这里找到的s3 PHP类: 我最初使用此代码放置对象(它正在工作): 然后我按照这里的指示做了:并添加了“x-amz-server-side”​-加密请求头。但现在,当我尝试放置一个对象时,它会毫无错误地失败 我的新代码是: S3::putObjectFile($file, $s3_bucket_name, $file_path, S3::ACL_PRIVATE, array(),

我已经决定利用amazons新的服务器端加密与s3,但是,我遇到了一个问题,我无法解决

我使用的是在这里找到的s3 PHP类:

我最初使用此代码放置对象(它正在工作):

然后我按照这里的指示做了:并添加了“x-amz-server-side”​-加密请求头。但现在,当我尝试放置一个对象时,它会毫无错误地失败

我的新代码是:

  S3::putObjectFile($file, $s3_bucket_name, $file_path, S3::ACL_PRIVATE,
     array(),
array( 
    "Content-Disposition" => "attachment; filename=$filename",
    "Content-Type" => "application/octet-stream",
        "x-amz-server-side​-encryption" => "AES256"
        )
))

有没有人尝试过这个新功能,或者有人看到代码中有错误


干杯。

该头应该是
$metaHeaders
数组的一部分,而不是
$requestHeaders
数组

S3::putObjectFile($file, $s3_bucket_name, $file_path, S3::ACL_PRIVATE,
     array(
        "x-amz-server-side​-encryption" => "AES256"
     ),
     array( 
       "Content-Disposition" => "attachment; filename=$filename",
       "Content-Type" => "application/octet-stream"
     )
);
以下是来自的方法定义:



您也可以考虑使用

,我们可以使用以下代码使用加密方式上载文件
$s3->创建对象($bucket\u name、$destination、array)(
'acl'=>AmazonS3::acl_PUBLIC,
“fileUpload”=>$file\u local,
“加密”=>“AES256”)

您可以使用官方sdk从

下载最新sdk:

use Aws\S3\S3Client;

$bucket = '*** Your Bucket Name ***';
$keyname = '*** Your Object Key ***';
// $filepath should be absolute path to a file on disk                      
$filepath = '*** Your File Path ***';

// Instantiate the client.
$s3 = S3Client::factory();

// Upload a file with server-side encryption.
$result = $s3->putObject(array(
    'Bucket'               => $bucket,
    'Key'                  => $keyname,
    'SourceFile'           => $filepath,
    'ServerSideEncryption' => 'AES256',
));
更改现有对象的服务器端加密(复制操作)
来源:

使用laravel 5+可以通过filesystems.php配置轻松完成,您不需要获取驱动程序或低级对象

's3' => [
  'driver' => 's3',
  'key'    => "Your Key",
  'secret' => "Your Secret",
  'region' => "Bucket Region",
  'bucket' => "Bucket Name",
  'options' => [
    'ServerSideEncryption' => 'AES256',
  ]
],
//Code
$disk->put("filename", "content", "public"); // will have AES for file

谢谢你的回答杰夫,不幸的是,它似乎也不起作用。我会做更多的修改,看看我是否忽略了什么地方。@davee-在这种情况下,我怀疑是因为库没有更新以支持新的服务器端加密。为什么不使用官方的PHPSDK呢?我原以为它也可能是这个类,但后来我查看了源代码,发现头文件的设置是这样的:if(is_array($requestHeaders))foreach($h=>$v)$rest->setHeader($h,$v);因此,从理论上讲,添加服务器端加密应该是可行的。这让我想到,也许亚马逊尚未在其所有系统中完全实现该功能。另外,不幸的是,我继承的代码严重依赖于这个类,我没有时间更新所有代码。我会看看是否能从亚马逊得到回复,并将我的发现发布在这里。干杯
use Aws\S3\S3Client;

$bucket = '*** Your Bucket Name ***';
$keyname = '*** Your Object Key ***';
// $filepath should be absolute path to a file on disk                      
$filepath = '*** Your File Path ***';

// Instantiate the client.
$s3 = S3Client::factory();

// Upload a file with server-side encryption.
$result = $s3->putObject(array(
    'Bucket'               => $bucket,
    'Key'                  => $keyname,
    'SourceFile'           => $filepath,
    'ServerSideEncryption' => 'AES256',
));
use Aws\S3\S3Client;

$sourceBucket = '*** Your Source Bucket Name ***';
$sourceKeyname = '*** Your Source Object Key ***';

$targetBucket = '*** Your Target Bucket Name ***';
$targetKeyname = '*** Your Target Object Key ***';

// Instantiate the client.
$s3 = S3Client::factory();

// Copy an object and add server-side encryption.
$result = $s3->copyObject(array(
    'Bucket'               => $targetBucket,
    'Key'                  => $targetKeyname,
    'CopySource'           => "{$sourceBucket}/{$sourceKeyname}",
    'ServerSideEncryption' => 'AES256',
));
's3' => [
  'driver' => 's3',
  'key'    => "Your Key",
  'secret' => "Your Secret",
  'region' => "Bucket Region",
  'bucket' => "Bucket Name",
  'options' => [
    'ServerSideEncryption' => 'AES256',
  ]
],
//Code
$disk->put("filename", "content", "public"); // will have AES for file