2014-10-08 140 views
0

所以,我有一个我想要下载的Amazon S3编码的URL。如果我通过URL不带引号,我会从S3获得403 Forbidden响应。命令行cURL带引号包裹的URL工作,PHP cURL不

curl -O https://zencoder-temp-storage-us-east-1.s3.amazonaws.com/t/20141008/413f96bd17a210c0cfe2997d83a4782c/Nerve_Flossing_Highly_Irratible_Radial_Nerve_Wartenburgs_Syndrome-thumb.jpg?AWSAccessKeyId=AKIAI456JQ76GBU7FECA&Signature=Sd18YXJIMvLqeRFZYCzDNYdpg7U%3D&Expires=1412866120 

但是,只要它包装在引号,在命令行的伟大工程:

curl -O "https://zencoder-temp-storage-us-east-1.s3.amazonaws.com/t/20141008/413f96bd17a210c0cfe2997d83a4782c/Nerve_Flossing_Highly_Irratible_Radial_Nerve_Wartenburgs_Syndrome-thumb.jpg?AWSAccessKeyId=AKIAI456JQ76GBU7FECA&Signature=Sd18YXJIMvLqeRFZYCzDNYdpg7U%3D&Expires=1412866120" 

但是...当我尝试在PHP中实现这一点,我挽救了0文件字节。

$curl = curl_init("'".$url."'"); 
$fp = fopen($filepath, "w"); 
curl_setopt($curl, CURLOPT_FILE, $fp); 
curl_exec ($curl); 
curl_close ($curl); 
fclose($fp); 

有没有办法用PHP来做到这一点,我错过了?

编辑:提供实际的S3网址以便于测试。

回答

0

看起来像是不是引号。在这种情况下,行情绝对不重要。

看起来像SSL证书有问题。我看到你的SSL证书不好。即使这很糟糕。

您需要打开验证关:

curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0); 
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); 

UPDATE

此代码的伎俩:

$curl = curl_init('https://some.amazon.bucket.s3.amazonaws.com/o/123456/582305890298509238/my-video.mp4?AWSAccessKeyId=RANDOMKEYHERE&Signature=SIG&Expires=1412805904'); 
$fp = fopen(getcwd() . '/1.txt', "w"); 
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2); 
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); 
fwrite($fp, curl_exec($curl)); 
fclose($fp); 
curl_close($curl); 

我已经检查这个

我还是认为你的主要问题是SSL证书...

顺便问一下文件的内容是:

<?xml version="1.0" encoding="UTF-8"?> 
<Error><Code>InvalidAccessKeyId</Code><Message>The AWS Access Key Id you provided does not exist in our records.</Message><RequestId>6DCACEEE9E886AF1</RequestId><HostId>JPHAbX6+Ql34/6Yvso0vofODswNtZvwPluJj3R6XBBsSkq0hjQ9cy/Aj6e73EOQt</HostId><AWSAccessKeyId>RANDOMKEYHERE</AWSAccessKeyId></Error> 
+0

它仍然保存一个0字节的文件。它在除-O之外的命令行上没有任何选项。只是不在PHP中。 – jpea 2014-10-08 16:14:43

0

PHP卷曲仅仅是需要一个参数。当您在命令行中添加引号时,您断言引号之间的任何内容都是您尝试传入该命令的特定参数。大多数命令行命令以这种方式工作。举例来说,如果你想在移动命令行的文件,你可以在报价添加路径:

mv foo.txt "/home/bar/foo.txt" 

这是伟大的,复杂的参数(如URL),文件名称中带有等空间

至于PHP,curl函数只是期待一个参数,它会在内部做适当的转义。所以,当你添加引号到卷曲PHP命令,你实际上问PHP加载此网址:

'https://some.amazon.bucket.s3.amazonaws.com/o/123456/582305890298509238/my-video.mp4?AWSAccessKeyId=RANDOMKEYHERE&Signature=SIG&Expires=1412805904' 

至于反对:

https://some.amazon.bucket.s3.amazonaws.com/o/123456/582305890298509238/my-video.mp4?AWSAccessKeyId=RANDOMKEYHERE&Signature=SIG&Expires=1412805904 

你刚才提到不使用引号不起作用在命令行中卷曲。你有没有尝试在PHP中添加引号?我的猜测是,这将工作。

另一个令人疲惫的事情是你的S3存储桶的权限。您可能试图从S3加载的文件没有正确的访问权限,允许PHP或您的Web服务器访问它。这会触发403错误。

+0

是的,我试过了。双打引号,单引号,不含引号。我还在S3上添加了资源的真实URL,希望能够帮助解决问题......此外,存储桶不是我的,它是由Zencoder维护的用于临时文件的存储桶。 – jpea 2014-10-08 16:38:24

-1

你的网址包含各种特殊字符和整个字符串放在一个单一的字符这就是为什么我们使用双引号。