2014-10-08 135 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

你的網址包含各種特殊字符和整個字符串放在一個單一的字符這就是爲什麼我們使用雙引號。