CODEIGNITER:使用readfile()

时间:2017-01-10 17:35:31

标签: php codeigniter pdf

在我的一个CODEIGNITER项目中,我有以下代码正常运行:

  $this->output
       ->set_content_type('application/pdf')
       ->set_output(file_get_contents($file));

为了使代码内存友好,我想使用php函数 readfile()代替 file_get_contents(),但它无法正常工作。

我注意到如果我返回图像但是不能与 PDF 一起使用,则readfile()有效。

我怎么能做到这一点?

2 个答案:

答案 0 :(得分:4)

readfile上的文档明确指出它只是将文件输出到浏览器。它只是将文件回显到stdout并返回从文件读取的字节数。如果要使用该功能,则必须不使用CodeIgniter输出功能。您需要使用更原始的基本PHP头函数。像这样:

$filepath = "/path/to/file.pdf";
// EDIT: I added some permission/file checking.
if (!file_exists($filepath)) {
    throw new Exception("File $filepath does not exist");
}
if (!is_readable($filepath)) {
    throw new Exception("File $filepath is not readable");
}
http_response_code(200);
header('Content-Length: '.filesize($filepath));
header("Content-Type: application/pdf");
header('Content-Disposition: attachment; filename="downloaded.pdf"'); // feel free to change the suggested filename
readfile($filepath);

exit; // this is important so that CodeIgniter doesn't parse any more output to ruin your file download

注意:如果执行此代码的用户(您的用户,apache,www-data,httpd等)无法读取$ filepath的权限,那么您可能会获得文件不可读错误。如果文件本身是可读的,但是文件本身不存在,则还可以获取文件不存在错误。 检查文件本身的权限以及该文件所在的目录。

答案 1 :(得分:-1)

如果您确定文件的mimetype

,请尝试以下代码
$contents = read_file($file);
    $this->output
            ->set_status_header(200)
            ->set_content_type('application/pdf')
            ->set_output($contents)
            ->_display();
    exit;

如果您不确定文件的mimetype,那么

$this->load->helper('file');

$file = '/path/to/pdf/file';
$contents = read_file($file);

 $this->output
        ->set_status_header(200)
        ->set_content_type(get_mime_by_extension($file_path))
        ->set_output($contents)
        ->_display();

参考: - https://codeigniter.com/user_guide/helpers/file_helper.html