PHP readfile() 保留 mime-type

Typ*_*pel 5 php mime-types

我正在尝试设置一个 PHP 脚本,它可以从实时 webroot 之外的文件夹中提取文件(针对经过验证的用户)。问题是,执行此操作时,即使我使用正确的“Content-Type”标头,文件也会下载为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);
Run Code Online (Sandbox Code Playgroud)

有趣的是,如果我通过浏览器以这种方式下载文件并在 Linux 中查看其属性,它会显示为“application/pdf”。但是,如果我使用 PHPmime_content_type()函数检查同一文件,它会读取为application/octet-stream.

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

有没有什么方法可以readfile()在不改变mime类型的情况下使用?或者,是否有更好的选择?

编辑

回答一下评论中的一些问题:

  1. Firefox 中的开发人员工具报告内联文件有一个Content-Type: application/pdf标头。
  2. 下载文件的 sha256sum 与原始文件不匹配。但是如何readfile()在不更改文件的情况下使用(或类似的)呢?