2010-08-17 107 views
1

我有這個數組。如何在PHP中從URL下載多個文件?

$urls = array(
'0'=>'http://www.domain.com/media1.mp3' 
'1'=>'http://www.domain.com/media2.mp3' 
'2'=>'http://www.domain.com/media3.mp3' 
) 

我想在PHP的幫助下同時下載這些文件。

我該怎麼做?有什麼建議麼?

我曾嘗試將標題放入for循環,但它所做的是將所有文件的內容組合在一個大的mp3文件中。

這是我的嘗試:

foreach($urls as $url) 
{ 
ob_start(); 
header("Cache-Control: public"); 
header("Content-Description: File Transfer"); 
header("Content-Disposition: attachment; filename=".basename($url)); 
header("Content-Type: audio/mpeg"); 
header("Content-Transfer-Encoding: binary"); 
print file_get_contents($url); 
ob_clean(); 
ob_flush(); 
flush(); 
sleep(1); 
} 

感謝 維沙爾

回答

0

退房cURL

PHP支持libcurl的,由Daniel Stenberg發明創造庫 ,那 讓你連接並通信 到許多不同類型的服務器 與許多不同類型的 協議。 libcurl目前支持 http,https,ftp,gopher,telnet, 字典,文件和ldap協議。 的libcurl還支持HTTPS 證書,HTTP POST,HTTP PUT,FTP上傳 (這也可以用 PHP的FTP擴展完成),HTTP基於表單的 上傳,代理,cookies和用戶 +密碼認證。

您可以通過the example並在for循環中使用類似的代碼。

+0

我也試過cURL!它不起作用。我也試過這個例子。 http://www.askapache.com/php/curl-multi-downloads.html#menu0-el1 但沒有快樂! – Vishal 2010-08-17 16:43:14

1

是否要將每個文件下載到磁盤?以下是使用CURL可以實現的方法。

$path = '/path/to/download/directory'; 

foreach ($urls as $url) 
{ 
    $ch = curl_init(); 

    curl_setopt($ch, CURLOPT_URL, $url); 

    $fp = fopen($path . '/' . basename($url), 'w'); 

    // Set CURL to write to disk 
    curl_setopt($ch, CURLOPT_FILE, $fp); 

    // Execute download 
    curl_exec ($ch); 
    curl_close ($ch); 

    fclose($fp); 
} 
+0

現在讓我試試吧 – Vishal 2010-08-17 16:56:30

+0

它只是在瀏覽器上打印所有內容!並表示許可被拒絕fopen。當我們打開時,它會在哪裏寫文件?我嘗試了我的c:/ windows文件夾,但它不起作用:( – Vishal 2010-08-17 17:01:04

+0

它會將文件寫入當前工作目錄。在您的情況下,指定目錄的絕對路徑可能會更好,並確保PHP具有權限我想修改我的例子,以反映這一點。 – 2010-08-17 17:20:31

0

看來你並沒有試圖下載文件,而是試圖爲它們服務。我對麼?

Stephen Curran和Fernando之前提供的兩個答案都假設您正在嘗試使用PHP進行下載,因此他們的解決方案對於使瀏覽器啓動3次單獨下載無效。

恐怕你不能使用PHP來做到這一點,雖然你可能仍然需要它的頭來強制瀏覽器下載文件,而不是顯示它們。您可能必須在客戶端使用JavaScript來啓動3個獨立的連接。

其中一個想法是在網頁上保留隱藏的<iframe>,然後使用JavaScript將每一個指向MP3文件。我認爲,如果你的框架的名字是someframe1,someframe2和someframe3,你可以簡單地做在JavaScript中這樣說:

someframe1.location.href = 'path/to/one.mp3'; 
someframe2.location.href = 'path/to/two.mp3'; 
someframe3.location.href = 'path/to/three.mp3'; 

請記住,你仍然可能需要PHP做頭。

希望它有幫助。

+0

嗨Helgi,感謝您的回覆。下載我的電腦上的文件。是您的解決方案去工作過嗎? – Vishal 2010-08-17 17:24:11

+0

哇,我很困惑。 你爲什麼發送消息頭和打印出的文件的內容,如果你想下載它們? – Teekin 2010-08-17 17:42:16

+0

比怎麼樣我下載他們?我的印象是,我們需要更改標題下載文件!例如,如果我想下載CSV文件,如果我改變hea它會立即開始下載文件。 – Vishal 2010-08-17 17:47:12

1

HTTP不直接支持在單個請求中下載多個文件。文檔正文中沒有規定MIME類型的分隔符來顯示一個文件結束和另一個文件開始的位置。因此,您所有的單個文件將被下載到一個單獨的文件中,如header('Content-type: attachment....')調用的最後一個副本所指定的那樣。

您的選擇是修改腳本以提供每個單獨文件的鏈接,或者執行某種服務器端歸檔(.zip,.tar)併發送該文件而不是單個文件。

+0

我確實有鏈接到每個單獨的文件。有什麼可以做的呢?它已經在陣列中了。 – Vishal 2010-08-17 18:03:38

+0

和壓縮所有文件,我仍然需要得到每個文件的內容,並把它們寫在服務器和ZIP的文件和下載.... – Vishal 2010-08-17 18:04:52