"Content-Length" 响应 header 不显示存储在 BLOB 中的 PDF 文件
PDF file stored in BLOB is not displayed with the "Content-Length" response header
以下示例用于在请求时显示 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()
然而,returns 451295
对于大小为 506,296 字节(约 495 KB)的上传 PDF 文件。
正在尝试使用 PHP 5.4 Google Chrome 和 Mozilla FireFox 的最新版本。
当您启用 mbstring
扩展时,strlen
函数 returns 字符串的长度(以字符为单位,不一定为字节)。解决方法是在 运行 时检测扩展情况并使用适当的方法。
处理此问题的一种方法是始终使用 returns 字节的函数,无论是否存在 mb
扩展名。示例:
if (2 & ini_get('mbstring.func_overload')) {
function bytes($string) {
return mb_strlen($string, '8bit');
}
} else {
function bytes($string) {
return strlen($string);
}
}
您当然可以重写它以将条件放入函数中,而不是使用条件函数。这会导致持续检查的 运行 时间惩罚,因此使用条件函数会更有效。不过,这取决于您的需求。
您也可以使用第三方库。上面的例子来自haldayne/boost。免责声明:我是 haldayne/boost.
的作者
以下示例用于在请求时显示 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()
然而,returns 451295
对于大小为 506,296 字节(约 495 KB)的上传 PDF 文件。
正在尝试使用 PHP 5.4 Google Chrome 和 Mozilla FireFox 的最新版本。
当您启用 mbstring
扩展时,strlen
函数 returns 字符串的长度(以字符为单位,不一定为字节)。解决方法是在 运行 时检测扩展情况并使用适当的方法。
处理此问题的一种方法是始终使用 returns 字节的函数,无论是否存在 mb
扩展名。示例:
if (2 & ini_get('mbstring.func_overload')) {
function bytes($string) {
return mb_strlen($string, '8bit');
}
} else {
function bytes($string) {
return strlen($string);
}
}
您当然可以重写它以将条件放入函数中,而不是使用条件函数。这会导致持续检查的 运行 时间惩罚,因此使用条件函数会更有效。不过,这取决于您的需求。
您也可以使用第三方库。上面的例子来自haldayne/boost。免责声明:我是 haldayne/boost.
的作者