使用codeigniter上传时,图像在mysql中不可用

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (87)
  1. 问题:当尝试通过codeigniter服务在MySql数据库字段(BLOB)中存储图像时,mysql中未启用该图像。(我知道这不是一个好习惯,但要求)。什么时候通过mysl管理员上传图像,图像确定。
  2. 我该如何测试?我使用邮递员有几个文本字段和一个“文件”字段,我将图像存储在数据库中。

邮差

  1. 测试结果:所有“文本”字段都存储在数据库中,“文件”字段按预期上传到目录,但是旁边数据不存储在字段“foto”中的数据库中

结果在MySql中

  1. Codeigneter中的代码:

public function CrearCliente(){
    $user = $this->input->post('user');
    $nombre = $this->input->post('nombre');
    $apellido = $this->input->post('apellido');
    $rut = $this->input->post('rut'); 
    $correo = $this->input->post('correo');
    $id_pais = $this->input->post('id_pais');
    $fecha = $this->input->post('creacion');
    $password = $this->input->post('password');
    $presentacion = $this->input->post('presentacion'); 
    $telefono = $this->input->post('telefono'); 
    $long = 0;
    $lat = 0;
    $res="null";
		$this->load->library('form_validation');
		$mimetypes = array("image/jpeg", "image/pjpeg", "image/gif", "image/png");
		$foto = $_FILES['foto']['name'];
		$tamanio = $_FILES['foto']["size"];
		$archivo = $_FILES['foto']['tmp_name'];
		$type = $_FILES['foto']['type'];
		$imagen = fopen($archivo, 'rb');
    $contenido2 = fread($imagen, $tamanio);
  	$contenido=file_get_contents($archivo,TRUE);
		$contenido3 = $this->db->escape_str($contenido);
	  fclose($imagen);
		if(!in_array($type, $mimetypes))
    											die("El archivo que subiste no es una imagen válida");
                          
		$config['upload_path'] = './imagenes/';
		$config['allowed_types'] = 'gif|jpg|jpeg|png';
		$config['max_size'] = '5000000';
		$config['quality'] = '90%';
		$config['overwrite'] = TRUE;
		$config['max_width']            = 1024;
    $config['max_height']           = 768;
		$config['file_name'] = $foto;
		$this->load->library('upload', $config);
		if (!$this->upload->do_upload('foto')) {
								$error = array('error' => $this->upload->display_errors());
								$data['uploadError'] = $this->upload->display_errors();
								die('error');
                }
		else{
								$data = array('upload_data' => $this->upload->data());
										}
		
    $this->load->model('Usuario');
    $res = $this->Usuario->InsertUsuario($contenido3,$user, $nombre, $apellido,$rut, $correo, $foto,$tamanio,$id_pais,$fecha,$password,$presentacion,$telefono,$long,$lat);   //	*se le asigna una variable al modelo para guardar el contenido que retorna la bd
    header('content-type: application/json'); //* se colcoa una cabezera para decir que se va a retornar un Json
    echo json_encode($res);		
   }




function InsertUsuario($contenido,$user, $nombre, $apellido,$rut, $correo, $foto,$tamanio,$id_pais,$fecha,$password,$presentacion,$telefono,$long,$lat)
   {
   
     $hoy=getdate();   
     if ($foto) {
       echo $contenido;
       
      }
    else{
       $imagen = null;
       header('content-type: application/json');
       echo json_encode("./upload/error.jpg");
    }   
     $this->db->trans_strict(TRUE);
     $this->db->trans_start();   
     $data = array(
         'user'          =>   $user,
         'nombre'          =>   $nombre,
         'apellido'          =>   $apellido,
         'id_rut'          =>   $rut,
         'correo'          =>   $correo,
         'foto'          =>   $contenido,
         'id_pais'          =>   $id_pais,
         'password'          =>   $password,
         'presentacion'  =>    $presentacion,
         'telefono'  =>    $telefono,
         'creacion'          =>   $fecha,
         'long'          =>   $long,
         'lat'          =>   $lat
         );
  
         $this->db->insert('wm_clientes',$data);
         $this->db->trans_complete();
         if ($this->db->trans_status() === FALSE)
             {
               return $res='ERROR';
             }
             else
             {
               return $res='OK';
             }
   }

  1. 问题:为什么与图像(jpg)文件相关的数据不存储在数据库中?检查图像。我尝试了很多东西但看起来比我预想的要困难。需要帮助大师! 强文
提问于
用户回答回答于

尝试这个:

public function CrearCliente() {
    $user = $this->input->post('user');
    $nombre = $this->input->post('nombre');
    $apellido = $this->input->post('apellido');
    $rut = $this->input->post('rut');
    $correo = $this->input->post('correo');
    $id_pais = $this->input->post('id_pais');
    $fecha = $this->input->post('creacion');
    $password = $this->input->post('password');
    $presentacion = $this->input->post('presentacion');
    $telefono = $this->input->post('telefono');
    $long = 0;
    $lat = 0;
    $res = "null";
    $this->load->library('form_validation');
    $mimetypes = array("image/jpeg", "image/pjpeg", "image/gif", "image/png");
    $foto = $_FILES['foto']['name'];
    $tamanio = $_FILES['foto']["size"];
    $archivo = $_FILES['foto']['tmp_name'];
    $type = $_FILES['foto']['type'];
    //$imagen = fopen($archivo, 'rb');
    //$contenido2 = fread($imagen, $tamanio);
    //fclose($imagen);
    if (!in_array($type, $mimetypes)) {
        // ci upload checks mimes for you
        show_error("El archivo que subiste no es una imagen válida");
    }

    $config['upload_path'] = './imagenes/';
    $config['allowed_types'] = 'gif|jpg|jpeg|png';
    $config['max_size'] = '5000000';
    $config['quality'] = '90%';
    $config['overwrite'] = TRUE;
    $config['max_width'] = 1024;
    $config['max_height'] = 768;
    $config['file_name'] = $foto;
    $this->load->library('upload', $config);
    if (!$this->upload->do_upload('foto')) {
        //$error = array('error' => $this->upload->display_errors());
        //$data['uploadError'] = $this->upload->display_errors();
        show_error($this->upload->display_errors());
    }
    $contenido = file_get_contents($this->upload->data('full_path'));
    $contenido3 = $this->db->escape_str($contenido);
    $this->load->model('Usuario');
    $res = $this->Usuario->InsertUsuario($contenido3, $user, $nombre, $apellido, $rut, $correo, $foto, $tamanio, $id_pais, $fecha, $password, $presentacion, $telefono, $long, $lat);   //  *se le asigna una variable al modelo para guardar el contenido que retorna la bd
    header('content-type: application/json'); //* se colcoa una cabezera para decir que se va a retornar un Json
    echo json_encode($res);
}

function InsertUsuario($contenido, $user, $nombre, $apellido, $rut, $correo, $foto, $tamanio, $id_pais, $fecha, $password, $presentacion, $telefono, $long, $lat) {

    $hoy = getdate();
    if ($foto) {
        echo $contenido;
    } else {
        $imagen = null;
        header('content-type: application/json');
        echo json_encode("./upload/error.jpg"); // this doesn't seem valid, also you should probably exit
    }
    // no need for transaction when only running 1 query
    $this->db->trans_strict(TRUE);
    $this->db->trans_start();
    $data = array(
        'user' => $user,
        'nombre' => $nombre,
        'apellido' => $apellido,
        'id_rut' => $rut,
        'correo' => $correo,
        'foto' => $contenido,
        'id_pais' => $id_pais,
        'password' => $password,
        'presentacion' => $presentacion,
        'telefono' => $telefono,
        'creacion' => $fecha,
        'long' => $long,
        'lat' => $lat
    );
    $this->db->insert('wm_clientes', $data);
    $this->db->trans_complete();
    if ($this->db->trans_status() === FALSE) {
        return $res = 'ERROR';
    } else {
        return $res = 'OK';
    }
}

我还建议将数据数组发送到插入函数而不是每个作为参数 - 它是混乱和混乱,容易出错。我也不建议将字符串返回类型与json返回类型混合,因为它是一个不一致的接口。此外,如果您使用的是ajax,则需要使用FormData或插件来上传文件,以防您不使用。

扫码关注云+社区

领取腾讯云代金券