PHP Amazon AWS S3 - 使用预签名URL上传对象

时间:2016-10-06 15:05:48

标签: php amazon-web-services amazon-s3

我正在尝试生成其他系统可用于将文件上传到我的S3存储桶的URL。我查看了文档和类似的问题,但是,我找不到合适的解决方案。

我尝试过多种方式创建PreSigned网址($this->s3是S3Client的引用):

1:

       $signedUrl = $this->s3->getCommand(
            'PutObject',
            array(
                'Bucket' => $this->bucket,
                'Key' => 'recording_test.mp3',
                'Body' => ''
            )
        )->createPresignedUrl('+2 hours');

2:

    $command = $this->s3->getCommand('PutObject', array('Bucket' => $this->bucket, 'Key' => 'recording_test3.mp3', 'Body' => ''));

    $request = $command->prepare();

    $signedUrl = $this->s3->createPresignedUrl($request, '+2 hours');

当尝试简单地访问URL时,我得到以下错误:

The request signature we calculated does not match the signature you provided. Check your key and signing method.

我也是这样试过的:         $ key =' recording_test2.mp3&#39 ;;         $ url = $ this-> bucket。' /'。$ key;

    $request = $this->s3->put($url);

    $signedUrl = $this->s3->createPresignedUrl($request, '+2 hours');

但是,这会生成格式为s3.amazonaws.com/bucket/key...的URL,这会产生有关无效端点的错误,并且应使用格式为bucket.s3.amazonaws.com/key...的端点。手动更改URL会产生与上述相同的无效签名错误。

我看不出我做错了什么或以其他方式生成PreSigned网址?

感谢您的帮助

1 个答案:

答案 0 :(得分:0)

创建签名网址时,不应使用Body密钥。生成的签名URL包括要上载的正文的签名。然后,当您尝试使用URL上传文件时,它无法将您正在使用的空字符串与文件内容相匹配。

此外,如果您使用Curl放置文件,我建议使用\ CURLFile,并记住使用curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");作为您的PUT请求。