PHP readfile(),它保留mime类型

PHP readfile(),它保留mime类型,php,mime-types,Php,Mime Types,我正在尝试设置一个PHP脚本,它可以从live webroot之外的文件夹中提取文件(针对已验证的用户)。问题是,在执行此操作时,即使我使用了正确的“内容类型”头,文件也会作为application/octet-stream下载。如果用户稍后尝试重新上载下载的文件,则会产生安全问题,因为即使该文件实际上是pdf,也会被检测为应用程序(我的应用程序只允许上载某些mime类型) 这是我用来将文件拉入浏览器的内容: $secret_file = "../attach/1/test.pdf"; hea

我正在尝试设置一个PHP脚本,它可以从live webroot之外的文件夹中提取文件(针对已验证的用户)。问题是,在执行此操作时,即使我使用了正确的“内容类型”头,文件也会作为
application/octet-stream
下载。如果用户稍后尝试重新上载下载的文件,则会产生安全问题,因为即使该文件实际上是pdf,也会被检测为应用程序(我的应用程序只允许上载某些mime类型)

这是我用来将文件拉入浏览器的内容:

$secret_file = "../attach/1/test.pdf";

header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private", false);
header("Content-Type: ".mime_content_type($secret_file));
header("Content-Disposition: inline; filename=\"test.pdf\";");
header("Content-Transfer-Encoding: binary");
readfile($secret_file);
有趣的是,如果我通过浏览器以这种方式下载文件并在linux中查看其属性,它将显示为“application/pdf”。但是,如果我使用PHP的
mime\u content\u type()
函数检查同一个文件,它的读数为
application/octet stream

我确实确认,以这种方式检查原始文件(在通过
readfile
)之前)会将其显示为
application/pdf

有没有办法在不更改mime类型的情况下使用
readfile()
?或者,有没有更好的选择

编辑

回答评论中的一些问题:

  • Firefox中的开发者工具报告内联文件具有
    内容类型:application/pdf
  • SHA256下载文件的总和与原始文件不匹配。但是在不更改文件的情况下,如何使用
    readfile()
    (或类似)呢

  • 什么是
    mime\u content\u type
    返回的?“如果用户稍后尝试重新上载下载的文件,则会产生安全问题,因为即使该文件实际上是pdf,也会被检测为应用程序。”不,这不是它的工作方式。mime类型通常不会标记到文件上,而是从文件扩展名中假定。因此,您所问的问题与您的假设并不特别相关。
    mime\u content\u type
    依赖于您的系统的mime magic文件进行正确设置,并读取文件内容以猜测文件类型。下载它不会改变内容,也不会改变检测它的方式。1)您是否已使用浏览器的开发工具查看实际发送的标题。2) 您是否与sha sums或类似软件进行过检查,以确定您是否真的得到了相同的文件,或者在传输过程中是否确实被损坏了…@Jakumi如果mime类型是基于文件扩展名假定的,为什么mime_content_type(“test.pdf”)会返回“application/octet stream”?我不是在做假设——只是报告实际结果。我也感到惊讶,这就是为什么我要问这个问题。