在 PHP 提供的浏览器中打开文件

Open a file in the browser served from PHP

一个简单的问题,可能被问过一百万次,但我已经搜索过了,但离让它起作用还差得很远。

我在 UserFrosting 框架中有一个 PHP 脚本,它通过浏览器向用户提供文件。如果他们 select 'Open' 而不是下载,我希望文件在他们的浏览器中打开。

问题是,唯一能正常打开的是文本文件。其他任何内容(目前测试过的 PDF 和 JPG)都只是作为 ASCII/garbled 代码的页面打开,而不是被解释为 PDF 或图像。

这是我使用的代码:

header('Content-Type: '. $mime);
header('Content-Length: ' . filesize($diskname));
header('Content-Disposition: inline; filename=' . $savename);
return readfile($diskname);

$mime 是通过函数设置的文件的 Mime 类型,因此对于我目前正在尝试查看的文件,可能是 application/pdfimage/jpeg

有谁知道文件无法正常打开的原因吗?

更新 检查响应 headers 后,我得到的内容类型是 text/html;charset=UTF-8 而不是 application/jpegapplication/pdf,它应该根据我的代码设置为我正在使用。我想知道这是否是 UserFrosting 问题?

由于我无法评论声誉的原因,我必须回答,即使我不是 100% 确定这是你的问题。

问题是,有时 PHP-files 会引起很多麻烦。

 <--- this little empty line
<?
code goes here
?>
 <--- or this one

标记的空行会毁了你的header。您是否检查了所有文件中的空行,这些空行被解释为内容而不是 PHP-Code?

启用警告也可以帮助解决这个问题。如果在设置 headers 之前有任何内容,您通常会收到一条警告,其中准确说明了这一点。

我们公司曾经有过这个,我们的 3 个开发人员花了将近一整天的时间才找到它,因为...原因。

编辑: 看到您的评论 "The character encoding of the HTML document was not declared." 实际上强调了我的陈述。无论如何,不​​是 100% 确定。

好的,问题解决了。正如我所怀疑的那样,它与 UserFrosting 框架有关,或者更具体地说,与 Slim 有关。

而不是使用 header('Content-Type: image/jpeg'); 设置 headers,我应该这样做:

$this->_app->response->headers->set('Content-Type', $mime);

问题已解决。 :)