PHP AWS api原始请求放入bucket生命周期

PHP AWS api原始请求放入bucket生命周期,php,amazon-web-services,amazon-s3,amazon-glacier,Php,Amazon Web Services,Amazon S3,Amazon Glacier,我正在创建一个网站,其中有一个功能,如果用户删除一个图像/视频,它将被存档,我使用AWS S3进行存储,在删除时,我想将其移动到Glacier上,我不想使用AWS SDK,所以我使用PHP cURL创建原始请求,从这个链接我尝试将bucket lifecycle放在一个对象上,并完成了一些代码,但它给了我一个签名不匹配的错误 signaturedesnotmatch我们计算的请求签名与您提供的签名不匹配。检查您的密钥和签名方法。 这是我的代码,在这里我想在x.php上应用生命周期,它在一个buc

我正在创建一个网站,其中有一个功能,如果用户删除一个图像/视频,它将被存档,我使用AWS S3进行存储,在删除时,我想将其移动到Glacier上,我不想使用AWS SDK,所以我使用PHP cURL创建原始请求,从这个链接我尝试将bucket lifecycle放在一个对象上,并完成了一些代码,但它给了我一个签名不匹配的错误

signaturedesnotmatch我们计算的请求签名与您提供的签名不匹配。检查您的密钥和签名方法。

这是我的代码,在这里我想在
x.php
上应用生命周期,它在一个bucket中,为它应用生命周期,我做错了什么?帮帮我

$AWSaccessKey = 'xxxxxxxxxxxxxxxx';
$AWSsecretKey = 'xxxxxxxxxxxxxxxxxxxxxxxxxx';
$AWSregion = 'xxxxxxxxx';

// bucket
$bucket   = 'xxxxxxxx';
$postdata = $filedata = '<LifecycleConfiguration>
  <Rule>
    <Filter>
      <Prefix>/</Prefix>
    </Filter>
    <Status>Enabled</Status>
    <Expiration>
      <Days>0</Days>
    </Expiration>
  </Rule>
</LifecycleConfiguration>';
$filetype = 'text/plain';
$path     = '/x.php'; // file on which i want to put lifecycle to move it to GLACIER

// file md5
$file_md5 = base64_encode(md5($filedata, true));

// file size
$filesize = strlen($filedata);

// date
$date = gmdate('D, d M Y H:i:s').' +0000';

// -> for putting lifecycle config
$params = array(
    'x-amz-date'          => gmdate('D, d M Y H:i:s \\G\\M\\T'),
);
//'x-amz-security-token'=> $auth['Token']

// sort and stringify params (different to other requests, this is formatted like headers)
$params_str = '';
uksort($params, 'strcmp');
foreach($params as $k=>$v){
    $params_str .= $k.': '.$v."\\n";
}

// -> for putting lifecycle config
$to_sign = "PUT\\n$file_md5\\n$filetype\\n\\n".$params_str.'/'.$bucket.$path;

// create signature
// Note: S3 uses SHA1 instead of 256!
$signature = base64_encode(hash_hmac('SHA1', $to_sign, $AWSsecretKey, true));

$headers = "Host: $bucket.s3.amazonaws.com\\n"; // change to your region
$headers .= $params_str;  // note that the params get added to the header
$headers .= 'Content-MD5: '.$file_md5."\\n";
$headers .= 'Authorization: AWS '.$AWSaccessKey.':'.$signature."\\n";
$headers .= 'Content-Length: '.$filesize."\\n";

$ch = curl_init("http://$bucket.s3-$AWSregion.amazonaws.com");
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_HTTPHEADER, explode('\n', $headers));
curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_VERBOSE, true);
curl_setopt($ch, CURLOPT_STDERR, fopen(dirname(__FILE__).'/errorlog.txt', 'w'));

$result = curl_exec($ch); 
var_dump($result);
$AWSaccessKey='xxxxxxxxxxxxxx';
$AWSsecretKey='xxxxxxxxxxxxxxxxxxxxxxxxxx';
$AWSregion='xxxxxxxxx';
//水桶
$bucket='xxxxxxxx';
$postdata=$filedata=$
/
启用
0
';
$filetype='text/plain';
$path='/x.php';//我想在其中放置生命周期以将其移动到冰川的文件
//文件md5
$file_md5=base64_编码(md5($filedata,true));
//文件大小
$filesize=strlen($filedata);
//日期
$date=gmdate('D,D M Y H:i:s')。+0000';
//->用于放置生命周期配置
$params=数组(
'x-amz-date'=>gmdate('D,dm Y H:i:s\\G\\M\\T'),
);
//'x-amz-security-token'=>$auth['token']
//排序和字符串化参数(与其他请求不同,其格式类似于标题)
$params_str='';
uksort($params,'strcmp');
foreach($k=>v的参数){
$params_str.=$k.:'$v.“\\n”;
}
//->用于放置生命周期配置
$to_sign=“PUT\\n$file\u md5\\n$filetype\\n\\n.“$params\u str./”.$bucket.$path;
//创建签名
//注意:S3使用SHA1而不是256!
$signature=base64_编码(hash_hmac('SHA1',$to_sign,$AWSsecretKey,true));
$headers=“主机:$bucket.s3.amazonaws.com\\n”;//更改到您所在的地区
$headers.=$params_str;//请注意,参数会添加到标题中
$headers.='Content-MD5:'.$file\u MD5.\\n;
$headers.='授权:AWS'.$AWSaccessKey'.:'.$signature.\\n“;
$headers.='Content Length:'.$filesize.\\n;
$ch=curl_init(“http://$bucket.s3-$AWSregion.amazonaws.com”);
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false);
curl_setopt($ch,CURLOPT_HTTPHEADER,explode('\n',$headers));
curl_setopt($ch,CURLOPT_POSTFIELDS,$postdata);
curl_setopt($ch,CURLOPT_CUSTOMREQUEST,“PUT”);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
curl_setopt($ch,CURLOPT_VERBOSE,true);
curl_setopt($ch,CURLOPT_STDERR,fopen)(dirname(_文件)'/errorlog.txt',w');
$result=curl\u exec($ch);
var_dump($结果);

我认为您不完全了解生命周期策略的工作原理

$path='/x.php';//我想在其中放置生命周期以将其移动到冰川的文件

不移动单个文件。您可以配置前缀。 这应该在XML文档中。 你已经有这个了

/

  • 放置生命周期应始终为
    /?生命周期
    。您将其命名为
    /x.php
  • 与V2相比,使用AWS签名V4可能更好,因为一些较新的地区不支持签名V2,但所有地区都支持签名V4。更多信息请点击此处:
  • 使用Signature V4,即使您确实看到错误消息
    SignatureDesNotMatch
    ,您也应该看到其他消息,
    。这些应该足以让您孤立并解决此问题
  • 您提到要将其移动到GLACIER,但在XML内容中没有提到这一点。请参阅本页的“示例1:添加生命周期配置-未启用bucket版本控制”部分,因为您需要XML中的
    GLACIER

  • 希望这能有所帮助。

    在特定路径上定义一个永久的生命周期规则可能更容易(例如
    s3::bucket/archive/
    )。然后,将文件移动到该路径进行归档。(当然,没有“移动”,它实际上包括复制和删除。)