我正在尝试在 drupal 中显示与文章关联的相应 PDF 文件,这样如果浏览器配备了呈现 pdf 的功能,它应该直接打开,如果没有显示带有“打开”、“保存”和“取消”的常规对话框允许用户在选项中进行选择。PDF 存在于公共 Web 服务器中,可以访问图像和文件等所有资源。
我用来完成的代码如下:
$pdf_file_name = "http://mysite.com/valid-pdf-file.pdf";
drupal_set_header('Content-type: application/pdf');
drupal_set_header('Content-Disposition: inline; filename="' . $pdf_file_name
. '"');
$fp = fopen($pdf_file_name, "r");
$file_open_timeout = 60;
if ($fp) {
stream_set_timeout($fp, $file_open_timeout);
while (!feof($fp)) {
echo fread($fp, 65536);
flush();
}
fclose($fp);
}
else {
watchdog("pdf logging", "Could not open the file " . $pdf_file_name);
}
尽管此代码适用于我的一些初始 pdf 文件(我假设它们是不超过 10 MB 的小文件),但它在许多其他文件上都失败了,并显示以下错误消息:
fopen(http://mysite.com/valid-pdf-file.pdf):无法打开流:HTTP 请求失败!HTTP/1.1 404 未找到
通过浏览器打开该文件http://mysite.com/valid-pdf-file.pdf的路径会直接呈现该文件,而不会出现任何错误消息。因此,我根据一些谷歌搜索尝试了stream_set_timeout
上面的代码,但尽管文件肯定存在,但仍然无法克服 404 错误。
这是一个无法打开的 URL 的示例:
“ http://fileservername.com/resources/sitename/2013/03/20/bed6e3de-41bf-4bf9-bed8-d21508eaa8ca/Trouble --云纲要优化.pdf”
我还用 url 编码文件路径进行了测试,但结果没有什么不同;urlencode($pdf_file_name)
在 fopen 和 readfile 中做了。
此外,我检查了这些麻烦的 pdf 文件的文件/文件夹权限是否与正常打开的文件/文件夹权限不同,但发现并没有什么不同。
此文件处理的替代代码
ob_clean();
flush();
readfile($pdf_file_name);
exit();
给出了相同的结果,其中麻烦的 pdf 返回 404,而其他的工作正常。任何关于我错过了什么来获得这个功能或更好地实现这个功能的任何建议都将不胜感激。