2011-09-03 101 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

即时尝试下载的文件是第三方网站上的远程文件,所以我想避免我的服务器将这些文件下载到我的服务器,然后将其上传到我的客户端。 –