2

我有这个数组。

$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);
}

谢谢维沙尔

4

4 回答 4

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);
}
于 2010-08-17T16:51:45.723 回答
1

您似乎不是在尝试下载文件,而是在尝试为它们提供服务。我对么?

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 来制作标题。

希望能帮助到你。

于 2010-08-17T17:13:47.823 回答
1

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

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

于 2010-08-17T18:01:36.257 回答
0

Check out cURL:

PHP supports libcurl, a library created by Daniel Stenberg, that allows you to connect and communicate to many different types of servers with many different types of protocols. libcurl currently supports the http, https, ftp, gopher, telnet, dict, file, and ldap protocols. libcurl also supports HTTPS certificates, HTTP POST, HTTP PUT, FTP uploading (this can also be done with PHP's ftp extension), HTTP form based upload, proxies, cookies, and user+password authentication.

You can go through the example and use a similar code inside your for loop.

于 2010-08-17T16:32:29.353 回答