2010-08-17 106 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