CodeIgniter 3:通过表单获取文件内容而非上传至服务器
在CodeIgniter 3中直接读取上传文件内容(不保存到服务器)的解决方案
我来帮你理清这个问题——在CodeIgniter 3里直接读取上传文件内容而不保存到服务器完全可行,你提到的file_get_contents确实是关键,但得用对姿势。下面分两种场景给你详细方案:
方法一:不依赖CI上传类,直接读取临时文件
PHP在处理文件上传时,会先把文件存到系统临时目录,我们不需要将它移动到服务器的永久存储位置,直接读取这个临时文件的内容就行。这种方式简单直接,适合不需要复杂验证的场景。
第一步:确保表单正确配置
首先你的HTML表单必须加上enctype="multipart/form-data",否则无法上传文件:
<form method="post" action="<?php echo site_url('your_controller/upload_read'); ?>" enctype="multipart/form-data"> <input type="file" name="userfile"> <button type="submit">上传并读取</button> </form>
第二步:控制器中读取内容
在你的控制器方法里,通过$_FILES全局变量获取临时文件路径,再用file_get_contents读取:
public function upload_read() { // 检查是否有文件上传且无错误 if(isset($_FILES['userfile']) && $_FILES['userfile']['error'] == UPLOAD_ERR_OK) { // 获取PHP临时文件的路径 $tmp_file_path = $_FILES['userfile']['tmp_name']; // 读取文件内容 $file_content = file_get_contents($tmp_file_path); // 这里根据你的需求处理内容,比如解析CSV、输出文本等 // 注意:如果是输出HTML内容,记得用htmlspecialchars防止XSS攻击 echo htmlspecialchars($file_content); } else { // 处理上传错误 $error_msg = match($_FILES['userfile']['error']) { UPLOAD_ERR_INI_SIZE => '上传文件超过php.ini限制的大小', UPLOAD_ERR_FORM_SIZE => '上传文件超过表单设置的大小限制', UPLOAD_ERR_PARTIAL => '文件仅部分上传,请重试', UPLOAD_ERR_NO_FILE => '请选择要上传的文件', default => '未知的上传错误' }; echo $error_msg; } }
注意事项
- 这种方式需要你自己处理文件验证(比如类型、大小),如果需要验证文件真实类型,建议用
finfo扩展代替依赖$_FILES['userfile']['type'](这个值可以被伪造)。 - 临时文件会在请求结束后被PHP自动删除,不用手动清理。
方法二:用CI上传类做验证,读完再删除文件
如果你需要利用CodeIgniter上传类的验证功能(比如限制文件类型、大小),可以先让CI完成验证并临时保存文件,读取内容后再删除它。
控制器代码示例
public function upload_with_ci_validation() { $this->load->library('upload'); // 配置上传参数:指定系统临时目录作为临时存储位置 $config['upload_path'] = sys_get_temp_dir(); $config['allowed_types'] = 'txt|csv|json|xml'; // 允许的文件类型,按需调整 $config['max_size'] = 2048; // 限制最大2MB,按需调整 $config['encrypt_name'] = false; // 不需要重命名文件 $this->upload->initialize($config); // 执行上传验证 if (!$this->upload->do_upload('userfile')) { // 验证失败,输出CI的错误信息 echo $this->upload->display_errors(); } else { // 获取上传文件的详细信息 $upload_data = $this->upload->data(); // 读取文件内容 $file_content = file_get_contents($upload_data['full_path']); // 处理你的文件内容 echo htmlspecialchars($file_content); // 读取完成后删除临时保存的文件 unlink($upload_data['full_path']); } }
为什么你之前可能报错?
大概率是这两个原因:
- 表单没加
enctype="multipart/form-data",导致文件根本没上传到服务器; - 尝试直接读取表单字段而不是临时文件路径,或者错误地使用了CI上传类的保存逻辑,没意识到可以读取后删除。
内容的提问来源于stack exchange,提问作者P. Nick
相关产品推荐
相关产品推荐

