【发布时间】:2016-10-14 06:49:47
【问题描述】:
以下示例用于在请求时显示 PDF 文件。
$sql = "SELECT file FROM file_upload WHERE id=:id and file_type in('pdf')";
$query = $conn->prepare($sql);
$query->execute(array(':id' => $_GET['id']));
$query->bindColumn("file", $file, PDO::PARAM_LOB);
$query->fetch(PDO::FETCH_BOUND);
$finfo = new finfo(FILEINFO_MIME);
$mimeType = $finfo->buffer($file);
header("Content-type: $mimeType");
header('Content-Description: PDF document');
header('Content-Transfer-Encoding: binary');
header('Accept-Ranges: bytes');
//header('Content-Length: '.strlen($file));
header('Expires: 0');
header('Pragma: no-cache');
header('Cache-Control: no-cache, must-revalidate, max-age=0');
ob_clean();
flush();
echo $file;
显示请求的 PDF 文件,但添加以下行时,
header('Content-Length: '.strlen($file));
浏览器不显示请求的 PDF 文件。浏览器发出一条消息。
可能是什么原因? strlen() 返回的长度似乎不是确切的长度。但是,strlen() 对于上传的大小为 506,296 字节(约 495 KB)的 PDF 文件返回 451295。
尝试使用 PHP 5.4 的最新版本的 Google Chrome 和 Mozilla FireFox。
【问题讨论】:
-
也许您启用了
mb扩展?试试mb_strlen($file, '8bit')。 -
该扩展已启用。它还返回与
strlen()相同的长度,这会导致相同的问题——没有变化。 -
它正在工作。我忘了提到第二个参数。它返回指定文件的确切长度
506296。如果mb扩展在生产中被禁用,是否有任何替代方案? -
是的,您必须将调用包装在一个条件中。这是库中的一个常见问题,(a) 使用字符串函数进行字节操作,(b) 必须处理可能包含或不包含
mb的运行时。我的回答应该解决如何支持这两个版本。