Скачать mp3s из массива url в zip-файл

У меня есть массив ссылок на mp3-файлы. Мне нужно, чтобы все mp3-файлы были загружены с сервера, а затем упакованы в архив.

Этот код ниже не работает:

Какие-либо предложения?

$audio_flies = array('http://example.com/1.mp3','http://example.com/2.mp3');
$zipname = 'file.zip';
$zip = new ZipArchive;
$zip->open($zipname, ZipArchive::CREATE);
foreach ($audio_files as $file) {
echo "$file";
$zip->addFile($file);
}
$zip->close();

header('Content-Type: application/zip');
header('Content-disposition: attachment; filename='.$zipname);
header('Content-Length: ' . filesize($zipname));
readfile($zipname);

Архив находится в неизвестном формате или поврежден

0

Решение

Сначала вы должны загрузить эти файлы и сохранить их локально на вашем сервере. Как только это будет сделано, вы сможете заархивировать их и сделать файл zip доступным для скачивания.

Самый основной способ достижения этого — использование PHP file_get_contents(), file_put_contents() а также parse_url().

Этот код не был тщательно протестирован.

// Fixed the name of the array
$audio_files = array('http://example.com/1.mp3', 'http://example.com/2.mp3');

// You need to change this to
// a path where you want to store your
// audio files (Absolute path is best)
$local_path = '/local/path/here/';
$zipname = 'file.zip';
$zip = new ZipArchive;
$zip->open($zipname, ZipArchive::CREATE);

// Download the files
// Not an elegant way to
// download files
foreach ($audio_files as $file) {
// First let's get the file name
// by parsing the URL
// and trimming the '/'
$file_name = ltrim(parse_url($file, PHP_URL_PATH), '\/');

// Download the file
$a_contents = file_get_contents($file);

// Place the downloaded content
// in the defined local path
file_put_contents($local_path . $file_name, $a_contents);

// Add the file to archive
$zip->addFile($local_path . $file_name);
}

$zip->close();

header('Content-Type: application/zip');
header('Content-disposition: attachment; filename='.$zipname);
header('Content-Length: ' . filesize($zipname));
readfile($zipname);

это это очень плохой способ достичь своей цели по следующим причинам (среди многих других):

  1. Нет времени ожидания для процесса загрузки
  2. Если файл не загружается, он останавливает выполнение
  3. Это может занять очень много времени (в зависимости от размера аудиофайлов), чтобы обслуживать ZIP-файл
  4. Нет правильного обработчика ошибок / исключений
  5. Много других причин относительно структуры, которые я не собираюсь здесь обсуждать.
1

Другие решения

попробуйте следующее: используйте parse_url, чтобы получить фактическое имя файла, используйте file_get_contents и file_put_contents, чтобы загрузить и сохранить данные локально …

$audio_flies = array('http://example.com/1.mp3','http://example.com/2.mp3');
$zipname = 'file.zip';
$zip = new ZipArchive;
$zip->open($zipname, ZipArchive::CREATE);
foreach ($audio_files as $file) {
echo "$file";
$parsed = parse_url($file);
$localfile = "." . $parsed["path"];
$mp3 = get_file_contents($file);
file_file_contents($localfile, $mp3);
$zip->addFile($localfile);
}
$zip->close();

header('Content-Type: application/zip');
header('Content-disposition: attachment; filename='.$zipname);
header('Content-Length: ' . filesize($zipname));
readfile($zipname);
-1

По вопросам рекламы [email protected]