PHP AWS api原始请求放入bucket生命周期
我正在创建一个网站,其中有一个功能,如果用户删除一个图像/视频,它将被存档,我使用AWS S3进行存储,在删除时,我想将其移动到Glacier上,我不想使用AWS SDK,所以我使用PHP cURL创建原始请求,从这个链接我尝试将bucket lifecycle放在一个对象上,并完成了一些代码,但它给了我一个签名不匹配的错误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
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
SignatureDesNotMatch
,您也应该看到其他消息,
和
。这些应该足以让您孤立并解决此问题GLACIER
希望这能有所帮助。在特定路径上定义一个永久的生命周期规则可能更容易(例如
s3::bucket/archive/
)。然后,将文件移动到该路径进行归档。(当然,没有“移动”,它实际上包括复制和删除。)