我正在建立一个私人网站,与我的亲戚分享一些古老的家书。为了防止字母被爬行,我使用一个名为smartReadFile的函数(如下图所示)将字母流到浏览器。(我会给这个家庭一个进入网站的密码。)字母是PDF,是用扫描仪创建的。
我发现有些字母总是显示得很好,有些则是断断续续地显示,而有些则根本不显示。所有这些都与Acrobat阅读器打开得很好。当一个字母显示失败时,我在(Firefox的)控制台中看到这条消息:
Invalid or corrupted PDF file.
PDF.js v2.11.298 (build: d370a281c)
Message: Invalid PDF structure.我已经用Firefox (94.0.2)和Chrome (96.0.4664.45)进行了测试,而在任何给定的时间,给定的字母在其中一个或另一个中的行为可能有所不同,但在这两个方面我似乎都有相同的基本问题。(刚和Edge一起做了测试。同样的问题。)
目前,这都是我的开发机器的本地特性,运行Windows 10 v.21H1。安装的web服务器是IIS。
这是我没有写的函数。(是从我儿子那里得到的,他原来是从别人那里得到的。)
function smartReadFile($location, $filename, $mimeType = 'application/octet-stream')
{
if (!file_exists($location))
{
header ("HTTP/1.1 404 Not Found");
return;
}
$size = filesize($location);
$time = date('r', filemtime($location));
$fm = @fopen($location, 'rb');
if (!$fm)
{
header ("HTTP/1.1 505 Internal server error");
return;
}
$begin = 0;
$end = $size - 1;
if (isset($_SERVER['HTTP_RANGE']))
{
if (preg_match('/bytes=\h*(\d+)-(\d*)[\D.*]?/i', $_SERVER['HTTP_RANGE'], $matches))
{
$begin = intval($matches[1]);
if (!empty($matches[2]))
{
$end = intval($matches[2]);
}
}
}
if (isset($_SERVER['HTTP_RANGE']))
{
header('HTTP/1.1 206 Partial Content');
}
else
{
header('HTTP/1.1 200 OK');
}
header("Content-Type: $mimeType");
header('Cache-Control: public, must-revalidate, max-age=0');
header('Pragma: no-cache');
header('Accept-Ranges: bytes');
header('Content-Length:' . (($end - $begin) + 1));
if (isset($_SERVER['HTTP_RANGE']))
{
header("Content-Range: bytes $begin-$end/$size");
}
if($_REQUEST['SaveAs'] == "1"){
header('Content-Disposition: attachment; filename=' . $filename);
}else{
header("Content-Disposition: inline; filename=\"$filename\"");
}
header("Content-Transfer-Encoding: binary");
header("Last-Modified: $time");
$cur = $begin;
fseek($fm, $begin, 0);
while(!feof($fm) && $cur <= $end && (connection_status() == 0))
{
print fread($fm, min(1024 * 16, ($end - $cur) + 1));
$cur += 1024 * 16;
}
}我的直觉是,这是关于文件大小或超时或类似的东西,但我不知道如何修复它。我试着缩小我正在阅读和传递的块的大小(通过将函数末尾的乘法器从16变到4或2),但没有运气。
发布于 2021-12-06 20:02:46
在我儿子的建议下,我在一个生产web服务器上尝试了一个简化版本(而不是我的本地安装),问题就消失了。因此,我将把它归结为IIS安装中的一些设置,这些设置我不需要弄清楚,然后继续完成这个项目。
https://stackoverflow.com/questions/70220790
复制相似问题