Как скачать несколько файлов с URL в PHP?

У меня есть этот массив.

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

Спасибо Вишал

1
задан Vishal 17 August 2010 в 16:28
поделиться

4 ответа

Вы хотите загрузить каждый файл на диск? Вот как этого добиться с помощью 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);
}
1
ответ дан 2 September 2019 в 22:05
поделиться

Посмотрите cURL :

PHP поддерживает libcurl, библиотеку созданный Даниэлем Стенбергом, позволяет подключаться и общаться ко многим различным типам серверов с множеством разных типов протоколы. libcurl в настоящее время поддерживает http, https, ftp, gopher, telnet, dict, file и ldap протоколы. libcurl также поддерживает HTTPS сертификаты, HTTP POST, HTTP PUT, FTP загрузка (это также можно сделать с помощью PHP-расширение ftp), на основе HTTP-формы загрузка, прокси, файлы cookie и аутентификация пользователя + пароль.

Вы можете просмотреть пример и использовать аналогичный код внутри цикла for.

0
ответ дан 2 September 2019 в 22:05
поделиться

HTTP не поддерживает прямую загрузку нескольких файлов за один запрос. В теле документа нет разделителей типа MIME, показывающих, где заканчивается один файл и начинается другой. Таким образом, все ваши отдельные файлы будут загружены в один, как указано последней копией заголовка ('Content-type: attachment ....') .

Вы можете изменить сценарий для предоставления ссылок на каждый отдельный файл или выполнить какое-то архивирование на стороне сервера (.zip, .tar) и отправить этот файл вместо отдельных.

1
ответ дан 2 September 2019 в 22:05
поделиться

Похоже, что вы не пытаетесь загрузить файлы, а скорее пытаетесь их обслужить. Я прав?

В двух предыдущих ответах Стивена Куррана и Фернандо предполагалось, что вы пытаетесь использовать PHP для загрузки, поэтому их решения не будут работать для того, чтобы заставить браузер инициировать 3 отдельные загрузки.

Боюсь, что вы не можете использовать PHP для этого, хотя он может понадобиться для заголовков, чтобы заставить браузер загрузить файлы, а не отображать их. Скорее всего, вам придется использовать JavaScript на стороне клиента, чтобы инициировать 3 отдельных соединения.

Одна из идей - держать на веб-странице скрытые