2015-05-05 72 views
0

我有一個指向mp3文件的鏈接數組。我需要從服務器下載所有的mp3,然後進行壓縮。從url數組下載mp3到zip文件

以下代碼無效:

有什麼建議嗎?

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

The archive is either in unknown format or damaged

+0

在這段代碼中你在下載文件?你確定'addFile()'封裝了下載過程嗎? (我非常懷疑) – Bassem

+0

到目前爲止我不下載它們。這是我需要幫助的一種。對不起,我的問題不太清楚。 –

回答

-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); 
+0

我得到這個代碼的致命錯誤: 致命的錯誤:調用未定義的函數get_file_contents() –

+0

我投這個答案,因爲你使用兩個函數是未定義的,你沒有注意到數組名稱的拼寫錯誤。 – Quill

1

你首先需要下載這些文件並將它們本地存儲在您的服務器上。一旦完成,您將能夠壓縮它們並使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. 關於結構的許多其他原因,我不會在這裏通過。
+0

感謝您提供非常有用的信息BassemDy。你有任何建議,以獲得許多MP3的URL到一個zip?從URL的? –

+0

mp3的數據庫將會改變,所以它需要是動態的,但是,也許我可以每天運行腳本一次並將zip存儲在服務器上,然後鏈接下載該zip文件? –

+0

是的,您可以使用像'wget'這樣的unix工具通過cronjob運行來下載和壓縮這些文件並將它們存儲在本地目錄中。然後,您將根據需要從磁盤提供zip文件,而不是每次根據請求創建它! – Bassem