问题: 当尝试通过codeigniter服务将图像存储在MySql数据库字段(BLOB)中时,该图像未在mysql中启用。 (我知道这不是一个好习惯,而是必要条件)。通过mysl管理员上传图像时,可以确定图像。
我如何测试? 我使用邮递员使用几个文本字段和一个“文件”字段,将图像存储在数据库中。
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';
}
}
答案 0 :(得分:0)
尝试一下:
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';
}
}
我还建议将数据数组发送到insert函数,而不是将每个数组作为参数发送-混乱且混乱,容易出错。我也不建议将字符串返回类型与json返回类型混合使用,因为这是一个不一致的接口。另外,如果您使用的是Ajax,则需要使用FormData
或插件来上传文件,以防万一。
答案 1 :(得分:0)
解决此问题的任何简单方法是将映像仅存储在服务器上(您已经在使用代码进行此操作),然后将映像名称作为varchar保存到数据库中。
$config['upload_path'] = './imagenes/';
上面是将其上传到服务器的代码。它使用codeigniter提供的上传库转到服务器上的该路径。
您现在可以在数据库中查询图像名称,而不是实际图像,并在图像标签的视图中使用该名称。这将从服务器中提取图像。
如果您对此方法有任何疑问,请告诉我。