Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Subir Imágenes con php + MVC

Estas en el tema de Subir Imágenes con php + MVC en el foro de PHP en Foros del Web. hola a todos, quería hacerles la sgte consulta, estoy usando MVC a mano y resulta que necesito trabajar con imagenes: en la página me da ...
  #1 (permalink)  
Antiguo 02/12/2015, 22:02
Avatar de detective_jd  
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 13 años
Puntos: 6
Subir Imágenes con php + MVC

hola a todos, quería hacerles la sgte consulta, estoy usando MVC a mano y resulta que necesito trabajar con imagenes: en la página me da el sgte error:

Notice: Undefined index: foto in /var/www/html/amnesia_1/Controller/VehiculosController.php on line 44

el código en el VehiculoController es este:

public function add(){
if(Session::get("tipo") == "admin"){
Session::set('mod', isset($_POST['txtmod']) ? $_POST['txtmod'] : Session::get('mod'));
$modelos = (Session::get('mod')!="") ? $this->mod_v->obtenerXDataList(Session::get('mod')) : array();
$tiposveh= $this->mod_tv->obtenerTodos();
if (isset($_POST['btnaceptar'])) {
if(empty($_POST['txtmat']) or empty($_POST['txtcant']) or empty($_POST['txtmod'])){
Session::set("msg","Ingrese los datos obligatorios (*) para continuar.");
Session::set('modelos', $modelos);
Session::set('tiposveh', $tiposveh);
$this->redirect(array('add.php'));
}
else{
if($this->checkImage($_FILES['foto'])!= null){

}
else {
Session::set("msg","Hubo un fallo al subir la imagen");
Session::set('modelos', $modelos);
Session::set('tiposveh', $tiposveh);
$this->redirect(array('add.php'));
}
}
}
else {
Session::set('modelos', $modelos);
Session::set('tiposveh', $tiposveh);
$this->redirect(array('add.php'));
}
}
else {
Session::set("msg","Debe ser administrador para acceder.");
$this->redirect(array('Main','index.php'));
}
}

private function checkImage($file){
if ($file["error"] > 0){
// echo "ha ocurrido un error";
return null;
} else {
$permitidos = array("image/jpg", "image/jpeg", "image/gif", "image/png");
$nombre = $file['name'];
$limite_kb = 100;
if (in_array($file['type'], $permitidos) && $file['size'] <= $limite_kb * 1024){
$ruta = "View/Layout/upload" . $nombre;
if (!file_exists($ruta)){
$resultado = @move_uploaded_file($file["tmp_name"], $ruta);
return ($resultado) ? $nombre : null;
} /*else {
echo $nombre . ", este archivo existe";
}*/
} else {
//echo "archivo no permitido, es tipo de archivo prohibido o excede el tamano de $limite_kb Kilobytes";
return null;
}
}
}

y en la vista Vehiculos/add.php:

<h3>Crear Vehículo</h3>
<form method="post" action="index.php?c=vehiculos&a=add" name="frm_addveh">
<table>
<tr>
<td><label for="mat">Matrícula del Vehículo:</label></td>
<td><input type="text" name="txtmat" id="mat" autofocus required="required" placeholder="Ingrese Matrícula" /></td>
</tr>
<tr>
<td><label for="cant">Cantidad del Vehículo:</label></td>
<td><input type="text" name="txtcant" id="cant" required="required" placeholder="Ingrese Cantidad" /></td>
</tr>
<tr>
<td><label for="descrip">Descripción del Vehículo:</label></td>
<td><textarea id="descrip" name="txtdes" rows="10" cols="40"></textarea></td>
</tr>
<tr>
<td><label for="foto">Foto del Vehículo:</label></td>
<!-- esta es la parte de la imagen -->
<td><input type="file" name="foto" id="foto" required="required" /></td>
</tr>
<tr>
<td>Modelo del Vehículo:</td>
<td>
<input id="mod" list="modelos" required="required" name="txtmod" />
<datalist id="modelos">
<?php foreach (Session::get('modelos') as $modelo) { ?>
<option value=<?php echo $modelo['id'];?> ><?php echo $modelo['marca']." - ".$modelo['nom'];?> </option>
<?php }?>
</datalist> &nbsp;
<input type="button" onclick="frm_addveh.submit();" value="Buscar" />
</td>
</tr>
<tr>
<td><label for="tipo">Tipo del Vehículo:</label></td>
<td>
<select name="cboxtipo" id="tipo">
<?php foreach (Session::get('tiposveh') as $tipoveh) { ?>
<option value="<?php echo $tipoveh['id']; ?>"><?php echo $tipoveh['nom']; ?></option>
<?php }?>
</select>
</td>
</tr>
</table>
<p>
<input type="submit" value="Aceptar" name="btnaceptar" />&nbsp;
<a href="index.php?c=vehiculos&a=index"><input type="button" value="Cancelar" /></a>
</p>
</form>

Estuve buscando, probando pero no dí con la respuesta.

Espero sus respuestas y saludos.
  #2 (permalink)  
Antiguo 03/12/2015, 07:47
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 10 años, 10 meses
Puntos: 379
Respuesta: Subir Imágenes con php + MVC

Puedes por favor usar el resaltado de código (Combo que dice Highlight) de esa forma facilitas que se te pueda ayudar
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #3 (permalink)  
Antiguo 03/12/2015, 18:23
Avatar de detective_jd  
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 13 años
Puntos: 6
Respuesta: Subir Imágenes con php + MVC

Cita:
Iniciado por detective_jd Ver Mensaje
hola a todos, quería hacerles la sgte consulta, estoy usando MVC a mano y resulta que necesito trabajar con imagenes: en la página me da el sgte error:

Notice: Undefined index: foto in /var/www/html/amnesia_1/Controller/VehiculosController.php on line 44

el código en el VehiculoController es este:

Código PHP:
Ver original
  1. public function add(){
  2.         if(Session::get("tipo") == "admin"){
  3.             Session::set('mod', isset($_POST['txtmod']) ? $_POST['txtmod'] : Session::get('mod'));
  4.             $modelos = (Session::get('mod')!="") ? $this->mod_v->obtenerXDataList(Session::get('mod')) : array();
  5.             $tiposveh= $this->mod_tv->obtenerTodos();
  6.             if (isset($_POST['btnaceptar'])) {
  7.                 if(empty($_POST['txtmat']) or empty($_POST['txtcant']) or empty($_POST['txtmod'])){
  8.                     Session::set("msg","Ingrese los datos obligatorios (*) para continuar.");
  9.                     Session::set('modelos', $modelos);
  10.                     Session::set('tiposveh', $tiposveh);
  11.                     $this->redirect(array('add.php'));
  12.                 }
  13.                 else{
  14.                     if($this->checkImage($_FILES['foto'])!= null){
  15.                        
  16.                     }
  17.                     else {
  18.                         Session::set("msg","Hubo un fallo al subir la imagen");
  19.                         Session::set('modelos', $modelos);
  20.                         Session::set('tiposveh', $tiposveh);
  21.                         $this->redirect(array('add.php'));
  22.                     }
  23.                 }
  24.             }
  25.             else {
  26.                 Session::set('modelos', $modelos);
  27.                 Session::set('tiposveh', $tiposveh);
  28.                 $this->redirect(array('add.php'));
  29.             }
  30.         }
  31.         else {
  32.             Session::set("msg","Debe ser administrador para acceder.");
  33.             $this->redirect(array('Main','index.php'));
  34.         }
  35.     }
  36.    
  37.     private function checkImage($file){
  38.         if ($file["error"] > 0){
  39.            // echo "ha ocurrido un error";
  40.            return null;
  41.         } else {
  42.             $permitidos = array("image/jpg", "image/jpeg", "image/gif", "image/png");
  43.             $nombre = $file['name'];
  44.             $limite_kb = 100;
  45.             if (in_array($file['type'], $permitidos) && $file['size'] <= $limite_kb * 1024){
  46.         $ruta = "View/Layout/upload" . $nombre;
  47.         if (!file_exists($ruta)){
  48.                     $resultado = @move_uploaded_file($file["tmp_name"], $ruta);
  49.                     return ($resultado) ? $nombre : null;
  50.         } /*else {
  51.                     echo $nombre . ", este archivo existe";
  52.         }*/
  53.             } else {
  54.         //echo "archivo no permitido, es tipo de archivo prohibido o excede el tamano de $limite_kb Kilobytes";
  55.                 return null;
  56.             }
  57.         }
  58.     }

y en la vista Vehiculos/add.php:

Código PHP:
Ver original
  1. <h3>Crear Vehículo</h3>
  2. <form method="post" action="index.php?c=vehiculos&a=add" name="frm_addveh">
  3.     <table>
  4.         <tr>
  5.             <td><label for="mat">Matrícula del Vehículo:</label></td>
  6.             <td><input type="text" name="txtmat" id="mat" autofocus required="required" placeholder="Ingrese Matrícula" /></td>
  7.         </tr>
  8.         <tr>
  9.             <td><label for="cant">Cantidad del Vehículo:</label></td>
  10.             <td><input type="text" name="txtcant" id="cant" required="required" placeholder="Ingrese Cantidad" /></td>
  11.         </tr>
  12.         <tr>
  13.             <td><label for="descrip">Descripción del Vehículo:</label></td>
  14.             <td><textarea id="descrip" name="txtdes" rows="10" cols="40"></textarea></td>
  15.         </tr>
  16.         <tr>
  17.             <td><label for="foto">Foto del Vehículo:</label></td>
  18. <!-- esta es la parte de la imagen -->
  19.             <td><input type="file" name="foto" id="foto" required="required" /></td>
  20.         </tr>
  21.         <tr>
  22.             <td>Modelo del Vehículo:</td>
  23.             <td>
  24.                 <input id="mod" list="modelos" required="required" name="txtmod" />
  25.                 <datalist id="modelos">
  26.                     <?php foreach (Session::get('modelos') as $modelo) { ?>
  27.                         <option value=<?php echo $modelo['id'];?> ><?php echo $modelo['marca']." - ".$modelo['nom'];?> </option>
  28.                     <?php }?>
  29.                 </datalist> &nbsp;
  30.                 <input type="button" onclick="frm_addveh.submit();" value="Buscar" />
  31.             </td>
  32.         </tr>
  33.         <tr>
  34.             <td><label for="tipo">Tipo del Vehículo:</label></td>
  35.             <td>
  36.                 <select name="cboxtipo" id="tipo">
  37.                     <?php foreach (Session::get('tiposveh') as $tipoveh) { ?>
  38.                         <option value="<?php echo $tipoveh['id']; ?>"><?php echo $tipoveh['nom']; ?></option>
  39.                     <?php }?>    
  40.                 </select>
  41.             </td>
  42.         </tr>
  43.     </table>
  44.     <p>
  45.         <input type="submit" value="Aceptar" name="btnaceptar" />&nbsp;
  46.         <a href="index.php?c=vehiculos&a=index"><input type="button" value="Cancelar" /></a>
  47.     </p>
  48. </form>
Estuve buscando, probando pero no dí con la respuesta..

Espero sus respuestas y saludos.
  #4 (permalink)  
Antiguo 03/12/2015, 18:26
Avatar de detective_jd  
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 13 años
Puntos: 6
Respuesta: Subir Imágenes con php + MVC

hhs gracias, mi problema esta con la función checkImage y con mi input foto que parece que no me lo reconoce.
  #5 (permalink)  
Antiguo 03/12/2015, 19:34
Avatar de detective_jd  
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 13 años
Puntos: 6
Respuesta: Subir Imágenes con php + MVC

Mira que simplifique un poco el add del VehiculosController.php, quedándome así:

Código PHP:
Ver original
  1. public function add(){
  2.         if(Session::get("tipo") == "admin"){
  3.             Session::set('mod', isset($_POST['txtmod']) ? $_POST['txtmod'] : Session::get('mod'));
  4.             $modelos = (Session::get('mod')!="") ? $this->mod_v->obtenerXDataList(Session::get('mod')) : array();
  5.             $tiposveh= $this->mod_tv->obtenerTodos();
  6.             if (isset($_POST['btnaceptar'])) {
  7.                 if(empty($_POST['txtmat']) or empty($_POST['txtcant']) or empty($_POST['txtmod'])){
  8.                     Session::set("msg","Ingrese los datos obligatorios (*) para continuar.");
  9.                 }
  10.                 else{
  11.                     if(isset($_FILES['foto'])){
  12.                         if($this->checkImage($_FILES['foto'])!= null){
  13.                        
  14.                         }
  15.                     }
  16.                 }
  17.             }
  18.             Session::set('modelos', $modelos);
  19.             Session::set('tiposveh', $tiposveh);
  20.             $this->redirect(array('add.php'));
  21.         }
  22.         else {
  23.             Session::set("msg","Debe ser administrador para acceder.");
  24.             $this->redirect(array('Main','index.php'));
  25.         }
  26.     }
  27.    
  28.     private function checkImage($file){
  29.         if ($file["error"] > 0){
  30.             Session::set('msg', "ha ocurrido un error");
  31.             return null;
  32.         } else {
  33.             $permitidos = array("image/jpg", "image/jpeg", "image/gif", "image/png");
  34.             $nombre = $file['name'];
  35.             $limite_kb = 100;
  36.             if (in_array($file['type'], $permitidos) && $file['size'] <= $limite_kb * 1024){
  37.         $ruta = "View/Layout/upload/" . $nombre;
  38.         if (!file_exists($ruta)){                    
  39.                     $resultado = @move_uploaded_file($file["tmp_name"], $ruta);
  40.                     if($resultado){
  41.                         return $nombre;
  42.                     }
  43.                     else {
  44.                         Session::set('msg', $nombre . ", este archivo existe");
  45.                         return null;
  46.                     }
  47.         }
  48.             } else {
  49.                 Session::set('msg', "archivo no permitido, no cumple con la extensión o excede a los $limite_kb kb");
  50.                 return null;
  51.             }
  52.         }
  53.     }

Sólo que ahora me da este problema:

Estrella Mario Bros_800.jpg, este archivo existe -> es el mensaje que me aparece (estoy usando LinuxMint)

cuando no se dónde esta el que dice existir.

Espero sus respuestas y saludos.
  #6 (permalink)  
Antiguo 03/12/2015, 20:01
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 10 años, 10 meses
Puntos: 379
Respuesta: Subir Imágenes con php + MVC

El problema esta en tu condición:
Código PHP:
Ver original
  1. $resultado = @move_uploaded_file($file["tmp_name"], $ruta);
  2.                     if($resultado){
  3.                         return $nombre;
  4.                     }
  5.                     else {
  6.                         Session::set('msg', $nombre . ", este archivo existe");
  7.                         return null;
  8.                     }
Debes de recordar que si la función move_uploaded_file puede regresar falso por los siguiente motivos:
  • Si filename no es un archivo válido subido, no sucederá ninguna acción, y move_uploaded_file() devolverá FALSE.
  • Si filename es un archivo subido válido, pero no puede ser movido por algunas razones, no sucederá ninguna acción, y move_uploaded_file() devolverá FALSE. Adicionalmente, se emitirá un aviso.
Así que para saber que sucede necesitas quitar el @ y habilitar el reporte de errores
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #7 (permalink)  
Antiguo 03/12/2015, 20:45
Avatar de detective_jd  
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 13 años
Puntos: 6
Respuesta: Subir Imágenes con php + MVC

Yo le saco el arroba y me aparecen estos errores:

Warning: move_uploaded_file(View/Layout/upload/Estrella Mario Bros_800.jpg): failed to open stream: Permission denied in /var/www/html/amnesia_1/Controller/VehiculosController.php on line 70

Warning: move_uploaded_file(): Unable to move '/tmp/phpCz6iQg' to 'View/Layout/upload/Estrella Mario Bros_800.jpg' in /var/www/html/amnesia_1/Controller/VehiculosController.php on line 70

cómo lo soluciono esto y lo que me dijiste de la condición??

Espero sus respuestas y saludos.
  #8 (permalink)  
Antiguo 08/12/2015, 11:39
Avatar de detective_jd  
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 13 años
Puntos: 6
Respuesta: Subir Imágenes con php + MVC

Hola a todos, solucioné mi problema cambiando los permisos de la carpeta de la app y gracias a la colaboración de Jorge Fernando Zabala Rueda quedó así:

http://pastebin.com/WLVjDu6c

pongo esto por si alguien lo necesita. Saludos!

Etiquetas: html, mvc, select
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:20.