Php 下载音频/mpeg mime类型的文件

Php 下载音频/mpeg mime类型的文件,php,http-headers,mime,readfile,Php,Http Headers,Mime,Readfile,我正在尝试下载带有音频/mpeg mime类型的远程mp3文件,而不是右键单击链接然后另存为。我尝试用php头修改头内容类型,然后用readfile()调用该文件。这工作得很好,但由于readfile()命令,这些文件来自我的服务器带宽。有没有其他方法可以在不占用带宽的情况下更改报头?我可以用javascript定义浏览器如何处理内容类型吗?有人有过同样的问题吗 提前感谢。通过使用mime类型音频/mpeg,您可以告诉浏览器“使用此文件执行默认操作”。例如,如果您有一个jpg文件,并将mime类

我正在尝试下载带有音频/mpeg mime类型的远程mp3文件,而不是右键单击链接然后另存为。我尝试用php头修改头内容类型,然后用readfile()调用该文件。这工作得很好,但由于readfile()命令,这些文件来自我的服务器带宽。有没有其他方法可以在不占用带宽的情况下更改报头?我可以用javascript定义浏览器如何处理内容类型吗?有人有过同样的问题吗


提前感谢。

通过使用mime类型音频/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的文件中


玩得开心

我想你需要做的是:

$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…
强制显示一个下载框,而不必右键单击->将目标另存为。

您能否澄清您试图从何处下载的内容?这些文件是否位于第三方服务器上?是的,这是正确的。这些文件位于第三方网站上,例如我无法直接修改标题。所有这一切的结果是浏览器不知道它是什么类型的文件,因此,虽然它将强制下载框,但强制下载不是正确的方法。使用
Content-Disposition:
header…同意,带有附件的内容处理也是必要的,但我认为这是一个给定的条件。还可以添加一个标题(“内容描述:PHP生成的数据”);唯一的问题是,因为这些文件是远程文件,我不能直接更改标题,我只能修改它们,正如我的问题中所述,但感谢您消除了我对标题和mime类型的混淆。对此,很抱歉,我用mime类型更新了我的示例,以消除混淆。要使用php远程下载文件,您应该使用fsockopen或curl,这里有一个很好的示例*9/download-a-remote-file-via-php.htmlwill fsock-open和curl仍然来自我的服务器带宽?但是这将来自我的服务器带宽和readfile,不是吗?会的,但是你怎么可能下载一个文件而不占用服务器的带宽呢?如果不使用带宽,则无法传输数据。。。您希望如何避免这种情况?我尝试下载的文件是第三方网站上的远程文件,因此我希望避免我的服务器将这些文件下载到我的服务器,然后将其上载到我的客户端。您希望您的客户端如何接收该文件?作为下载盒还是作为嵌入式播放器?当你访问原始站点时会发生什么?你有下载盒或嵌入式播放器吗?让我来澄清一下。remoteserver.com/some.mp3上有音频/mpeg mime类型的文件。在我的网站上,客户端下载一些.mp3,而不是音频/mpeg mime指定的流媒体。有没有一种方法可以在服务器不下载some.mp3的情况下下载some.mp3,更改标题,然后将其上载到客户端,例如客户端是否可以从remoteserver.com而不是我的站点下载some.mp3?