从没有 ajax/jquery/javascript 的表单上传 Codeigniter 文件

Codeigniter file upload from a form without ajax/jquery/javascript

Context :我正在使用表单 #updateprofileform 用户注册后更新 user_profile 数据, 我能够使用标准验证和 insert/update 使用 user_model 处理所有其他表单字段。 问题是 resume 字段应该接受文件作为输入类型并上传到服务器并将其在服务器上的路径(例如 http://domain/uploads/$filename)存储到数据库中的列。

预期 登录用户,能够查看他的详细信息(如果已经在数据库中),如果个人资料不完整则更新详细信息。

问题:我找到了如何使用 CI 框架将文件上传到服务器或如何使用 [=36= 在此上下文中上传文件的方法].但我正在为上述问题寻找简单的解决方案,它可以在不依赖技术的情况下完成工作。

user_profile.php(查看)

<table>
<form class="row" name="updateprofile" action = "<?php echo base_url()?>user/user_profile" method="POST">
<tr>
        <td><label for="email">Email ID</label></td><td><input class="form-control" name="email" placeholder="Email-ID" type="text" value="<?php if (isset($email)) echo $email;?>" /> <span style="color:red"><?php  echo form_error('email'); ?></span></td>
    </tr>
  <tr>
        <td><label for="resume">Resume</label></td>
        <td>
          <input name="resume" placeholder="Upload resume" type="file" value="<?php if (isset($resume)) echo $resume;?>" />
          <span style="color:red"><?php  echo form_error('resume'); ?>
          </span>
        </td>
    </tr>
  <tr>
        <td></td>
        <td><div class="col-md-6 col-lg-3"> <button type="submit" class="btn btn--primary type--uppercase" name="updateprofile" value="updateprofile" formaction = "<?php echo base_url()?>user/user_profile">Update Profile</button> </div></td>
    </tr>
  </form>
</table>

user_controller

class User extends CI_Controller {

    public function __construct()
    {
        parent::__construct();
$config = array(
        'upload_path' => "./uploads/",
        'allowed_types' => "doc|docx|pdf",
        'overwrite' => TRUE,
        'max_size' => "2048000", // Can be set to particular file size , here it is 2 MB(2048 Kb)
        //'max_height' => "768",
        //'max_width' => "1024"
        );
        $this->load->library('upload', $config);
    }
  public function user_profile()
    {  
      $resume = $this->input->post('resume');
  if ($this->user_model->set_user_profile($id,FALSE) )
            { if($this->do_upload($resume)){
                $this->session->set_flashdata('msg_success','Updation Successful!');
                  echo validation_errors();}
            }
            else
            {
                $this->session->set_flashdata('msg_error','Error! Please try again later.');
                redirect('user/user_profile');
            }
  public function do_upload($resume){

    if($this->upload->do_upload($resume))
    {
    $data = array('upload_data' => $this->upload->data($resume));

    $this->load->view('user_profile',$data);
    }
    else
    {
    $error = array('error' => $this->upload->display_errors($resume));
    $this->load->view('user_profile', $error);
    }
    }

目前总是出错....出错!请稍后再试 。所以感谢这里的一些指示,可以一起上传文件和表单数据,并在没有 ajax/jquery 的情况下将文件位置保存在数据库中。

谢谢

将表单定义更改为以下内容:

<form class="row" action = "<?php echo base_url('user/user_profile'); ?>" method="post" enctype="multipart/form-data" name="updateprofile" >

已解决! 需要 4 个重要步骤,并且在所有其他 post 的大多数问答中缺少一些步骤,以便在我有时间时在 github 中分享此 complete.will 示例代码。

  1. 表单加密类型必须是enctype="multipart/form-data"(感谢 致@Javier Larroulet 和@dexter )
  2. do_upload 方法默认查找 name=userfile 的文件字段 (感谢@Alex!引用了这个),所以,如果你有 表单的文件字段名称与 userfile 不同,那么只有它是 需要提及 do_upload('filefieldname') 否则 可选
  3. 上传库配置的加载很棘手.. 如果你 autoupload上传库,然后load->library upload config会失败!,你 只是 =>初始化 it.$this->upload->initialize($config);如果你 没有使用自动加载上传库,那么是的,你可以加载它 从控制器。 $this->load->library('upload', $config);
  4. 当你使用上传时,你必须捕获表单验证错误 和数据错误分开(再次感谢@Alex 指出这一点)

codeigniter 在此 link (https://www.codeigniter.com/userguide3/libraries/file_uploading.html#the-controller ) 提供了一个很好的文档,但没有突出常规错误。

希望这 post 帮助某人不要再浪费 24 小时进行调试。