2014-01-21 69 views
0

我有這樣一個網址:PHP ReadFile的()URL問題

http://r16---sn-4g57kn6e.googlevideo.com/videoplayback?&quality=medium&signature=797C0FEB1961E6226294D5FC19BC0CD28657975C.1E745D852200D14B706F0EBF9EA8762680374564&itag=43&mv=m&ip=84.19.165.220&ipbits=0&ms=au&ratebypass=yes&source=youtube&mt=1390347607&id=8b92b07ff9cd9862&key=yt5&fexp=942502,916626,929305,936112,924616,936910,936913,907231,921090&upn=cMPazwtmyZU&sver=3&sparams=id,ip,ipbits,itag,ratebypass,source,upn,expire&expire=1390371882&type=video%2Fwebm%3B+codecs%3D%22vp8.0%2C+vorbis%22&fallback_host=tc.v12.cache5.googlevideo.com&title=Requiem+For+A+Dream+Original+Song&title=Requiem For A Dream Original Song 

的問題是,readfile()函數生成特殊字符的錯誤原因(錯誤的請求)。

如果我使用urlencode(),則會更糟。

我該如何處理?

+1

真棒跟蹤BTW。現在我不得不喝酒自己再次睡覺,雖然 – PeeHaa

+2

這可能有助於[外部URL的PHP​​ readfile()](http://stackoverflow.com/questions/4752389/php-readfile-of-external-url):) – Timmy

+0

哦是啊,就是。我從4小時開始收聽(重複功能)。編碼時非常好:D – Michael

回答

0

結合的東西,我在我原來的答覆,加上一些在布拉德的答案的想法,我提供了以下解決方案

<?php 
$url='http://r16---sn-4g57kn6e.googlevideo.com/videoplayback?&quality=medium&signature=797C0FEB1961E6226294D5FC19BC0CD28657975C.1E745D852200D14B706F0EBF9EA8762680374564&itag=43&mv=m&ip=84.19.165.220&ipbits=0&ms=au&ratebypass=yes&source=youtube&mt=1390347607&id=8b92b07ff9cd9862&key=yt5&fexp=942502,916626,929305,936112,924616,936910,936913,907231,921090&upn=cMPazwtmyZU&sver=3&sparams=id,ip,ipbits,itag,ratebypass,source,upn,expire&expire=1390371882&type=video%2Fwebm%3B+codecs%3D%22vp8.0%2C+vorbis%22&fallback_host=tc.v12.cache5.googlevideo.com&title=Requiem+For+A+Dream+Original+Song&title=Requiem For A Dream Original Song'; 
$cleanUrl = parseQuery($url); 
$data = getData($cleanUrl); 
echo "file read in OK\n"; 

function parseQuery($url) { 
    preg_match('/(https?:\/\/[^?]+\?)(.*)$/', $url, $rawQuery); 
    preg_match_all('/([^=]+)=([^&]+)&/', $rawQuery[2], $queries); 
    $qArray = array_combine($queries[1], $queries[2]); 
    $newUrl = $rawQuery[1] . http_build_query($qArray); 
    return $newUrl; 
} 

function getData($url) { 
$useragent="Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1"; 

$curl = curl_init(); 
curl_setopt($curl, CURLOPT_URL, $url); 
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, false); 
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($curl, CURLOPT_USERAGENT, $useragent); 
$data = curl_exec($curl); 
curl_close($curl); 
return $data; 
} 
?> 

這主要包括以下步驟:

  1. 取初始URL,並將其分爲「?之前的內容,以及之後的內容」
  2. 「之前的內容」未觸及; 「之後的東西」被分成兩個數組 - 查詢的鍵和值(「一切高達=」,以及「高達&的所有數值」)
  3. 這兩個數組然後被組合成一個有效的查詢字符串(來自Brad的回答)http_build_query array
  4. 最後,我使用curl來獲取文件(僅僅因爲我知道它比readfile()更好)。

它似乎適用於我。讓我知道,如果它不適合你...

+0

我的DOMLogs現在非常討厭你。 – Ohgodwhy

+0

不,它與useragent無關。問題是url的格式。 'curl_exec():23不是有效的cURL句柄資源' – Michael

1
+0

抱歉,我無法關注你。你能舉個例子嗎?正如我上面所說,我編碼除了http://之外的所有東西。即使沒有標籤,它也不起作用。 – Michael

+0

@Michael Right,你的編碼比你應該的要多。 – Brad

+0

嗯,但我不能手動建立網址。 – Michael