2011-09-03 157 views
0

下載文件我想下載的音響/ MPEG MIME類型,而不是右擊,然後保存爲鏈接遠程 MP3文件。我試着用php頭修改頭文件內容類型,然後用readfile()調用文件。這工作得很好,但由於readfile()命令文件出來我的服務器帶寬。是否有另一種方法來改變標題而不需要帶寬成本?我可以定義瀏覽器如何處理與JavaScript的內容類型?有誰有同樣的問題?音頻/ MPEG MIME類型

在此先感謝。

+1

你能澄清你想從哪裏下載嗎?這些文件是否位於第三方服務器上? –

+0

是的,這是正確的文件是在第三方網站,例如我不能直接修改頭文件 –

回答

1

通過使用mime type audio/mpeg,您可以告訴瀏覽器「使用此文件執行默認操作」。例如,如果您有一個jpg文件並將mime類型設置爲image/jpeg,則瀏覽器將讀取jpg並將其顯示在瀏覽器窗口中。

解決方案是使用MIME類型的應用程序/數據。這將下載離開瀏覽器的文件。

這將是

header("Content-type: application/data"); 

== ==更新

一個更完整的方法

header("Content-type: application/data"); 
header("Content-Disposition: attachment; filename=$this->filename"); 
header("Content-Description: PHP Generated Data"); 
readfile($this->file); 

如果你想有一個動態的MIME類型的讀者,你可以使用這個

$type = $this->get_mime_type($this->filename); 
header("Content-type: " . $type); 

... 

private function get_mime_type($filename) { 

    $fileext = substr(strrchr($filename, '.'), 1); 

    if (empty($fileext)) { 
     return (false); 
    } 

    $regex = "/^([\w\+\-\.\/]+)\s+(\w+\s)*($fileext)/i"; 
    $lines = file("mime.types", FILE_IGNORE_NEW_LINES); 

    foreach ($lines as $line) { 
     if (substr($line, 0, 1) == '#') { 
      continue; // skip comments 
     } 

     if (!preg_match($regex, $line, $matches)) { 
      continue; // no match to the extension 
     } 

     return ($matches[1]); 
    } 
    return ("application/data"); // no match at all, revert to something that will work 
} 

而且,要獲取MIME類型列表,您可以檢查我的實驗版本,保存顯示的內容並將其保存到網站根目錄中名爲mime.types的文件中。

http://www.trikks.com/lab/mime.html

玩得開心

+0

所有這一切導致瀏覽器不知道它是什麼類型的文件,所以雖然它會強制下載框,它不是強制下載的正確方法。使用'Content-Disposition:'標題代替... – DaveRandom

+0

同意,內容處置與附件也是必要的,但我認爲這是一個給定的。添加標題也很好(「Content-Description:PHP生成的數據」); –

+0

唯一的問題是因爲這些文件是遠程文件,我不能直接修改標題,我只能修改它們,正如我的問題所述,但是感謝您清理我的混淆頭文件和MIME類型 –

0

我認爲你需要做的是這樣的:

$pathOfAudioFile = '/path/to/my/file.mp3'; 

header('Content-Type: audio/mpeg'); 
header('Content-Length: '.filesize($pathOfAudioFile)); 

// This next line forces a download so you don't have to right click... 
header('Content-Disposition: attachment; filename="'.basename($pathOfAudioFile).'"'); 

readfile($pathOfAudioFile); 

使用Content-Disposition: attachment...強制下載框出現,而不必點擊右鍵 - >另存目標如。

+0

但這將會出現我的服務器帶寬與讀取文件不是嗎? –

+0

它會,但是如何在不使用服務器帶寬的情況下下載文件?你不能在沒有使用帶寬的情況下傳輸數據......你想如何避免這種情況? – DaveRandom

+0

即時嘗試下載的文件是第三方網站上的遠程文件,所以我想避免我的服務器將這些文件下載到我的服務器,然後將其上傳到我的客戶端。 –