【问题标题】:PDF file stored in BLOB is not displayed with the "Content-Length" response header存储在 BLOB 中的 PDF 文件未显示“Content-Length”响应标头
【发布时间】: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 的运行时。我的回答应该解决如何支持这两个版本。

标签: php pdf blob


【解决方案1】:

当您启用mbstring 扩展时,strlen 函数以字符形式返回字符串的长度,而不必以字节形式返回。解决方法是在运行时检测扩展情况并使用适当的方法。

处理此问题的一种方法是使用始终返回字节的函数,而不管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 的作者。

【讨论】:

  • 这个条件语句是什么意思,2 & ini_get('mbstring.func_overload')(对不起,来自Java环境)?
  • mbstring 扩展可以根据配置修改三种不同类别的函数——邮件函数、字符串函数和ereg 函数。仅当 mbstring 扩展配置为覆盖字符串函数时,strlen(及其 str* 朋友)才会受到影响。因此,您可以启用 mbstring 扩展,但不会影响字符串函数。这个条件检查。另请参阅the mbstring docs on function overrides。
猜你喜欢
  • 2020-07-15
  • 1970-01-01
  • 2011-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-25
  • 2013-04-06
相关资源
最近更新 更多