在我的一个CODEIGNITER项目中,我有以下代码正常运行:
$this->output
->set_content_type('application/pdf')
->set_output(file_get_contents($file));
为了使代码内存友好,我想使用php函数 readfile()代替 file_get_contents(),但它无法正常工作。
我注意到如果我返回图像但是不能与 PDF 一起使用,则readfile()有效。
我怎么能做到这一点?
答案 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