You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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']);
    }
}

为什么你之前可能报错?

大概率是这两个原因:

  1. 表单没加enctype="multipart/form-data",导致文件根本没上传到服务器;
  2. 尝试直接读取表单字段而不是临时文件路径,或者错误地使用了CI上传类的保存逻辑,没意识到可以读取后删除。

内容的提问来源于stack exchange,提问作者P. Nick

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:47:02