能直接预览的文件包括图片(image/)、纯文本(text/plain等)、PDF(application/pdf)、音视频(audio/、video/*);Office文档如.docx需转PDF或调用外部服务,因浏览器不原生支持其MIME类型。

CodeIgniter 本身不内置文件预览能力,所有“预览”都依赖前端行为或第三方服务——PDF、图片、文本可直接渲染,Office 文档(.docx/.xlsx)和音视频则必须转为浏览器可读格式或调用外部服务。别指望 $this->load->view() 能直接打开一个 Word 文件。
哪些文件能直接在浏览器里预览?
只要 MIME 类型被浏览器原生支持,且服务器正确返回响应头,就能直接展示:
-
image/*(如.jpg、.png)→ 用<img src="...">即可 -
text/plain、text/csv、application/json→ 用<pre><code>包裹file_get_contents()结果 -
application/pdf→ 用<embed src="..." type="application/pdf">或<iframe>,但需确保 Nginx/Apache 允许跨域或同源加载 -
audio/*、video/*→ 用<audio controls>或<video controls>,路径必须可被 Web 服务器直接访问(不能走 CI 的 index.php 路由)
注意:file_get_contents() 读取大文件会阻塞 PHP 进程;建议对 >2MB 的文本类文件加截断逻辑,或改用流式读取 + 分页展示。
为什么上传的 .docx 打不开?
浏览器根本不认识 application/vnd.openxmlformats-officedocument.wordprocessingml.document。你看到的“空白页”或下载弹窗,是浏览器放弃渲染的正常反应。
可行解只有两个:
- 后端转 PDF:用
LibreOffice --headless --convert-to pdf命令行工具(需服务器装 LibreOffice),再把生成的 PDF 返回给前端;CI 中调用需严格限制超时与输入路径(防目录穿越) - 前端调用 Office Online 或 Google Docs Viewer:例如
<iframe src="https://docs.google.com/gview?url== urlencode($public_url) ?>&embedded=true">,但要求文件 URL 公开可访问,且存在隐私与外链风险
别尝试用 PHP 解析 .docx(如 PHPWord)再拼 HTML —— 格式兼容性极差,表格/样式/分页基本不可控。
如何安全地提供文件 URL 给前端?
CI 的默认路由机制会拦截所有请求,导致 /uploads/report.docx 被当成控制器方法 404。必须绕过框架,让 Web 服务器直出文件:
- 把上传目录(如
uploads/)放在public/或assets/下,确保 Web 根目录可直接访问该路径 - 在 Apache 中确认
mod_mime已启用,并添加AddType application/vnd.openxmlformats-officedocument.wordprocessingml.document .docx - Nginx 需在 server 块中显式声明
types { application/vnd.openxmlformats-officedocument.wordprocessingml.document docx; } - 绝对不要用
readfile()+Content-Disposition: inline输出二进制文件——容易触发 XSS(尤其当文件名含恶意脚本)或内存溢出
真正的难点从来不是“怎么显示”,而是“谁有权看、看到什么版本、是否已过期”。权限控制必须在生成 URL 前完成,而不是靠前端藏链接。


















