Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在PHP中从URL下载多个文件?_Php_Curl_File Get Contents - Fatal编程技术网

如何在PHP中从URL下载多个文件?

如何在PHP中从URL下载多个文件?,php,curl,file-get-contents,Php,Curl,File Get Contents,我有这个数组 $urls = array( '0'=>'http://www.domain.com/media1.mp3' '1'=>'http://www.domain.com/media2.mp3' '2'=>'http://www.domain.com/media3.mp3' ) 我想在PHP的帮助下同时下载这些文件 我该怎么做?有什么建议吗 我曾尝试过将标题放入循环中,但它所做的是将所有文件的内容合并到一个大的mp3文件中 这就是我所尝试的: foreach($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的帮助下同时下载这些文件

我该怎么做?有什么建议吗

我曾尝试过将标题放入循环中,但它所做的是将所有文件的内容合并到一个大的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);
}
谢谢 Vishal退房:

PHP支持libcurl,一个库 由Daniel Stenberg创作的 允许您连接和通信 到许多不同类型的服务器 有许多不同类型的 协议。libcurl目前支持 http、https、ftp、gopher、telnet、, dict、文件和ldap协议。 libcurl还支持HTTPS 证书、HTTP POST、HTTP PUT、FTP 上载(这也可以通过 PHP的ftp扩展),基于HTTP表单 上传、代理、cookie和 用户+密码身份验证


您可以在for循环中使用类似的代码。

是否要将每个文件下载到磁盘?下面是使用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);
}

看起来你不是想下载文件,而是想为它们服务。我说得对吗

Stephen Curran和Fernando之前提供的两个答案假设您正在尝试使用PHP进行下载,因此他们的解决方案无法使浏览器启动3个单独的下载

我担心您不能使用PHP来实现这一点,尽管您可能仍然需要它作为标题来强制浏览器下载文件,而不是显示它们。您可能需要在客户端使用JavaScript来启动3个独立的连接

一个想法是在网页上隐藏一个文件,然后使用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来制作标题


希望有帮助。

HTTP不支持在一个请求中直接下载多个文件。文档正文中没有提供MIME类型dividor来显示一个文件的结束位置和另一个文件的开始位置。因此,您的所有单个文件都将下载到一个单独的文件中,如
标题('Content-type:attachment…')
调用的最后一个副本所指定


您可以选择修改脚本以提供指向每个文件的链接,或者执行某种服务器端存档(.zip、.tar)并发送该文件而不是单个文件。

我也尝试了cURL!它不起作用。我也试过这个例子。但是没有快乐!它只是在浏览器上打印所有内容!并表示fopen的许可被拒绝。当我们做fopen时,它将在哪里写入文件?我尝试了我的c:/windows文件夹,但它不工作:(它会将文件写入当前工作目录。在您的情况下,最好指定目录的绝对路径,并确保PHP具有写入此目录的权限。我将修改我的示例以反映这一点。我很困惑。您是尝试下载文件还是提供文件(或两者兼而有之)?嗨,Helgi,谢谢你的回复。我真的想在我的电脑上下载这些文件。你的解决方案在那里也能用吗?哇,我很困惑。如果你想下载文件,为什么你要发送标题并打印出文件的内容?而我怎么下载呢?我的印象是我们需要更改标题来下载文件例如,如果我想下载CSV文件,如果我更改了文件头,它将立即开始下载文件。我确实有指向每个文件的链接。可以这样做吗?它已经在数组中。要压缩所有文件,我仍然需要获取每个文件的内容并将其写入服务器,然后压缩这些文件d下载它。。。。