PHP Amazon文件上传签名

时间:2011-12-02 09:46:22

标签: php amazon-s3

我尝试将文件上传到我的amazon s3,参考本教程 http://www.anyexample.com/programming/php/uploading_files_to_amazon_s3_with_rest_api.xml

但我收到以下错误

HTTP/1.1 403 Forbidden
x-amz-request-id: 10F111F91A85CFC5
x-amz-id-2: 6pBJs+OKZOZdTF3zQw0MLM62zGAAsCFyeJsv/xzYB+wM7+7RnZU+k1rtcpTWC8VS
Content-Type: application/xml
Transfer-Encoding: chunked
Date: Fri, 02 Dec 2011 09:35:21 GMT
Server: AmazonS3

2bf
<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>SignatureDoesNotMatch</Code>
<Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message>
<StringToSignBytes>50 55 54 0a 0a 0a 46 72 69 2c 20 30 32 20 44 65 63 20 32 30 31 31 20 30 39 3a 33 37 3a 35 30 20 2b 30 30 30 30 0a 2f 74 61 6e 65 77</StringToSignBytes>
<RequestId>10F111F91A85CFC5</RequestId>
<HostId>6pBJs+OKZOZdTF3zQw0MLM62zGAAsCFyeJsv/xzYB+wM7+7RnZU+k1rtcpTWC8VS</HostId>
<SignatureProvided>6V2sLdHEJ9uWZO0G81q5QQzSa9Y=</SignatureProvided><StringToSign>PUT

任何想法 提前致谢

1 个答案:

答案 0 :(得分:2)

没有您的代码查看它很难提供帮助,但这里有一些您可能会觉得有帮助的示例代码:

class myS3Helper{
public function getSignedImageLink($timeout = 1800, $my_aws_secretkey, $my_aws_key)
{

    $now = new Zend_Date(); //Gives us a time object that is set to NOW
    $now->setTimezone('UTC'); //Set to UTC a-la AWS requirements
    $now->addSecond($timeout); //set the time in the time object to a point in the future
    $expirationTime = $now->getTimestamp(); //returns unix timestamp representation of the time.

    $signature = urlencode(
            base64_encode(
                    hash_hmac(
                            'sha1', $this->_generateStringToSign($expirationTime),
                            $my_aws_secretkey, 
                            true
                            )
                    )
            );

    //Yes - this is ugly but hopefully readable 
    $url = 'https://';
    $url .= Zend_Service_Amazon_S3::S3_ENDPOINT; //e.g s3.amazonaws.com
    $url .= $this->_getImagePath(); //e.g /mybucket/myFirstCar.jpg
    $url .='?AWSAccessKeyId=' . $my_aws_key;
    $url .='&Signature=' . $signature; //signature as returned by below function
    $url .='&Expires=' . $expirationTime;

    return $url;


}

protected function _generateStringToSign($expires)
{   

    $string = "GET\n"; //Methods
    $string .= "\n";
    $string .= "\n";
    $string .= "$expires\n"; //Expires
    $string .= $this->_getImagePath();

    return $string;
}