我正在尝试建立一个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);
有趣的是,如果我通过浏览器以这种方式下载文件并在linux中查看其属性,它将显示为“ application / pdf”。但是,如果我使用PHP的mime_content_type()
函数检查同一文件,则其读为application/octet-stream
。
我确实确认以这种方式检查原始文件(在通过readfile
提取之前)将其显示为application/pdf
。
是否可以使用readfile()
而不更改mime类型?或者,也许有更好的选择吗?
编辑
回答评论中的一些问题:
Content-Type: application/pdf
标头。readfile()
(或类似名称)?