CodeIgniter中大写文件名图片无法在生产环境显示问题求助
解决CodeIgniter生产服务器大写文件名图片无法显示的问题
这个坑我之前踩过!根本原因就是本地Windows环境不区分文件名大小写,但生产服务器(大多是Linux)严格区分大小写。你数据库里存的是小写文件名,但实际上传到服务器的文件还是大写,自然就匹配不上,导致图片加载失败。直接在上传环节把文件名强制转成小写就能彻底解决,给你两种可行的修改方案:
方案一:上传前直接指定小写文件名(更稳妥)
在初始化上传配置的时候,先把原始文件名转成小写,直接用这个小写名称存储文件,这样就不用后续重命名了:
public function create() { // 检查登录状态 if (!$this->session->userdata('logged_in')) { redirect('users/login'); } $data['title'] = 'Create Post'; // 上传基础配置 $config['upload_path'] = './assets/images/posts/'; $config['allowed_types'] = 'gif|jpg|png'; $config['max_size'] = '2048'; $config['max_width'] = '1920'; $config['max_height'] = '1080'; // 重点:获取原始文件名并转成小写 $original_filename = $_FILES['userfile']['name']; $config['file_name'] = strtolower($original_filename); // 加载上传类并执行上传 $this->load->library('upload', $config); if (!$this->upload->do_upload('userfile')) { $errors = array('error' => $this->upload->display_errors()); $this->load->view('posts/create', array_merge($data, $errors)); } else { // 直接获取小写文件名存入数据库 $upload_data = $this->upload->data(); $data['post_image'] = $upload_data['file_name']; // 这里已经是小写了 // 后续插入数据库的逻辑 $this->post_model->create_post($data); redirect('posts'); } }
方案二:上传后重命名文件(适合已有上传逻辑的修改)
如果你的上传逻辑已经写好,不想改配置,可以在上传成功后,把服务器上的文件重命名为小写:
public function create() { // 检查登录状态 if (!$this->session->userdata('logged_in')) { redirect('users/login'); } $data['title'] = 'Create Post'; // 上传配置 $config['upload_path'] = './assets/images/posts/'; $config['allowed_types'] = 'gif|jpg|png'; $config['max_size'] = '2048'; $config['max_width'] = '1920'; $config['max_height'] = '1080'; $this->load->library('upload', $config); if (!$this->upload->do_upload('userfile')) { $errors = array('error' => $this->upload->display_errors()); $this->load->view('posts/create', array_merge($data, $errors)); } else { $upload_data = $this->upload->data(); // 生成小写文件名 $lowercase_filename = strtolower($upload_data['file_name']); // 重命名服务器上的文件 rename($upload_data['full_path'], $config['upload_path'] . $lowercase_filename); // 把小写文件名存入数据库 $data['post_image'] = $lowercase_filename; // 插入数据库 $this->post_model->create_post($data); redirect('posts'); } }
额外处理:批量修改已有大写文件名
如果服务器上已经有一批大写文件名的图片,得手动把它们转成小写才能正常显示。你可以登录服务器,执行以下Linux命令(替换成你的图片文件夹路径):
cd /path/to/your/assets/images/posts for file in *; do mv "$file" "$(echo $file | tr '[:upper:]' '[:lower:]')"; done
这个命令会把文件夹里所有文件的名称转成小写,注意执行前最好先备份一下文件哦!
内容的提问来源于stack exchange,提问作者Harun Anwar
相关产品推荐
相关产品推荐

