Foros del Web » Programando para Internet » PHP »

Tengo un problema al pasar archivos por un form

Estas en el tema de Tengo un problema al pasar archivos por un form en el foro de PHP en Foros del Web. Hola, que tal? Tengo un formulario para editar registros en la BD, que contiene 3 campos de texto (titulo, descripción y texto) y 2 campos ...
  #1 (permalink)  
Antiguo 25/03/2010, 06:55
Avatar de fakulicious  
Fecha de Ingreso: mayo-2008
Ubicación: Mendoza
Mensajes: 140
Antigüedad: 15 años, 11 meses
Puntos: 2
Pregunta Tengo un problema al pasar archivos por un form

Hola, que tal?

Tengo un formulario para editar registros en la BD, que contiene 3 campos de texto (titulo, descripción y texto) y 2 campos file (imagen y miniatura).

Le puse unas condicionales para que si los input file estaban vacíos, no ejecute el cambio de la imagen en el campo blob de la bd.

Según como hago la condicional, funcionan ciertas cosas y otras no. Por ejemplo:

Si uso:
Código PHP:
if(isset($_POST['imagen'])){
     
//Todo lo que tiene que hacer con la imagen

Se guardan los cambios en los campos de texto, pero no en la imagen.

Si uso:
Código PHP:
if(isset($_FILES['imagen'])){
     
//Todo lo que tiene que hacer con la imagen

Se guardan los cambios en la imagen, pero no en los campos de texto. Y el script se corta en cierto momento ya que queda la pantalla en blanco. Pero no me da ningún error. Por eso me imagino que no está guardando los otros campos en la BD, porque no llega a ejecutar esa consulta.

Les dejo el código completo para que vean si he hecho algo mal, porque ya probé muchísimas cosas y no le encuentro la vuelta.

Ah, también probé con if(!empty($_FILES['imagen']['tmp_name'])) y pasaba lo mismo que con el segundo ejemplo que di.

Bueno, el código completo es el siguiente:

Código PHP:
<?php
# Nombre temporal de las thumbnails
define("TEMP_THUMB""thumb");

# Nombre temporal de las fotos
define("TEMP_FOTO""foto");

// Mime types permitidos
$mimetypes = array("image/jpeg""image/pjpeg""image/gif""image/png");

if(!isset(
$_POST['guardar']) && !isset($_GET['idServ'])){
    
header("Location: servicios.php");
}

if(isset(
$_GET['idServ'])){
    
$idServ $_GET['idServ'];
}

if(isset(
$_POST['guardar'])){

    include(
'incluir/config.php');

    
$nombre $_POST['nombre'];
    
$descripcion $_POST['descripcion'];
    
$texto addslashes($_POST['texto']);

    if(isset(
$_POST['imagen'])){
        
$tmpNameFoto $_FILES['imagen']['tmp_name'];
        
$fileTypeFoto $_FILES['imagen']['type'];
        
        
//Guardo las fotos y las thumbnails en la BD
    
        // Verificamos si el archivo es una imagen válida
        
if(!in_array($fileTypeFoto$mimetypes)){
            
$message "El archivo que subiste no es una imagen válida";
            return 
$message;
        }
        
        switch(
$fileTypeFoto){
            case 
$mimetypes[0]:
            case 
$mimetypes[1]:
                
$foto imagecreatefromjpeg($tmpNameFoto);
                break;
            case 
$mimetypes[2]:
                
$foto imagecreatefromgif($tmpNameFoto);
                break;
            case 
$mimetypes[3]:
                
$foto imagecreatefrompng($tmpNameFoto);
                break;
        }
    
        switch(
$fileTypeFoto) {
            case 
$mimetypes[0]:
            case 
$mimetypes[1]:
                
imagejpeg($fotoTEMP_FOTO);
                break;
            case 
$mimetypes[2]:
                
imagegif($fotoTEMP_FOTO);
                break;
            case 
$mimetypes[3]:
                
imagepng($fotoTEMP_FOTO);
                break;
        }
                
        
// Extrae los contenidos de las fotos
        # contenido de la foto original
        
$fp fopen(TEMP_FOTO"rb");
        
$tfoto fread($fpfilesize(TEMP_FOTO));
        
$tfoto addslashes($tfoto);
        
fclose($fp);
        
        
// Borra archivos temporales si es que existen
        
@unlink($tmpNameFoto);
        @
unlink(TEMP_FOTO);
        
        
$cons mysql_query("UPDATE servicios SET foto = '$tfoto', typeFoto = '$fileTypeFoto' WHERE idServ = '$idServ' LIMIT 1;"$link) or die('Error MySQL: '.mysql_error($link));
        
        
mysql_close($link);
    }
    
    if(isset(
$_POST['thumb'])){
        
$tmpNameThumb $_FILES['thumb']['tmp_name'];
        
$fileTypeThumb $_FILES['thumb']['type'];
        
        
//Guardo las fotos y las thumbnails en la BD
    
        // Verificamos si el archivo es una imagen válida
        
if(!in_array($fileTypeThumb$mimetypes)){
            
$message "El archivo que subiste no es una imagen válida";
            return 
$message;
        }
        
        switch(
$fileTypeThumb){
            case 
$mimetypes[0]:
            case 
$mimetypes[1]:
                
$thumb imagecreatefromjpeg($fileTypeThumb);
                break;
            case 
$mimetypes[2]:
                
$thumb imagecreatefromgif($fileTypeThumb);
                break;
            case 
$mimetypes[3]:
                
$thumb imagecreatefrompng($fileTypeThumb);
                break;
        }
    
        switch(
$fileTypeThumb) {
            case 
$mimetypes[0]:
            case 
$mimetypes[1]:
                
imagejpeg($thumbTEMP_THUMB);
                break;
            case 
$mimetypes[2]:
                
imagegif($thumbTEMP_THUMB);
                break;
            case 
$mimetypes[3]:
                
imagepng($thumbTEMP_THUMB);
                break;
        }
                
        
// Extrae los contenidos de las fotos
        # contenido de la foto original
        
$fp fopen(TEMP_THUMB"rb");
        
$tthumb fread($fpfilesize(TEMP_THUMB));
        
$tthumb addslashes($tthumb);
        
fclose($fp);
        
        
// Borra archivos temporales si es que existen
        
@unlink($fileTypeThumb);
        @
unlink(TEMP_THUMB);
        
        
$cons mysql_query("UPDATE servicios SET thumb = '$tthumb', typeThumb = '$fileTypeThumb' WHERE idServ = '$idServ' LIMIT 1;"$link) or die('Error MySQL: '.mysql_error($link));
        
        if(!
$cons){
            
$resultado 'error';
        } else {
            
$resultado 'ok';
            
mysql_close($link);
        }
    }
    
    
$cons mysql_query("UPDATE servicios SET nombre = '$nombre', descripcion = '$descripcion', texto = '$texto' WHERE idServ = '$idServ' LIMIT 1;"$link) or die('Error MySQL: '.mysql_error($link));
        
    if(!
$cons){
        
$resultado 'error';
    } else {
        
$resultado 'ok';
    }

    
header("Location: editarServicio.php?idServ=".$idServ."&resultado=".$resultado);

}

?>


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Panel de Administración</title>
<link href="incluir/estilos.css" rel="stylesheet" type="text/css" />
<script src="incluir/SpryValidationTextField.js" type="text/javascript"></script>
<link href="incluir/SpryValidationTextField.css" rel="stylesheet" type="text/css" />
<script type="text/javascript" src="../ckeditor/ckeditor.js"></script>
<script type="text/javascript">
    window.onload = function()
    {
        CKEDITOR.replace( 'texto',
        {
            customConfig : 'incluir/ckeditor_config.js',
            filebrowserUploadUrl : 'incluir/upload.php'
        });
        
    };
</script>
</head>

<body>
<?php include('incluir/header.php'); ?>
<div id="contenido">
  <h2>Editar servicio </h2>
<?php
include('incluir/config.php');

$cons mysql_query("SELECT * FROM servicios WHERE idServ= '$idServ' LIMIT 1;"$link) or die('Error MySQL: '.mysql_error($link));

while(
$row mysql_fetch_array($cons)){
?>
  <form action="editarServicio.php?idServ=<?php echo $row['idServ']; ?>" method="post" enctype="multipart/form-data" name="form1" id="form1">
    <table width="960" border="0" cellspacing="2" cellpadding="3">
      <tr>
        <td width="231" valign="top" bgcolor="#EEE">Nombre</td>
        <td valign="top" bgcolor="#EEE"><span id="sprytextfield1">
          <label>
            <input name="nombre" type="text" id="nombre" value="<?php echo $row['nombre']; ?>" />
          </label>
        <span class="textfieldRequiredMsg">Se necesita un valor.</span></span></td>
      </tr>
      <tr>
        <td valign="top" bgcolor="#EEE">Descripción</td>
        <td valign="top" bgcolor="#EEE"><label>
          <textarea name="descripcion" id="descripcion" cols="45" rows="5"><?php echo $row['descripcion']; ?></textarea>
        </label></td>
      </tr>
      <tr>
        <td valign="top" bgcolor="#EEE">Texto</td>
        <td valign="top" bgcolor="#EEE"><label>
          <textarea name="texto" id="texto" cols="45" rows="5"><?php echo $row['texto']; ?></textarea>
        </label></td>
      </tr>
      <tr>
        <td valign="top" bgcolor="#EEE">Foto o Imagen (780x250)<?php if($row['foto'] != ''){ ?><br /><img src="foto.php?idServ=<?php echo $row['idServ']; ?>" width="200" height="65" /><?php ?></td>
        <td valign="top" bgcolor="#EEE"><label>
          <input type="file" name="imagen" id="imagen" />
        </label></td>
      </tr>
      <tr>
        <td valign="top" bgcolor="#EEE">Imagen miniatura (370x150)<?php if($row['thumb'] != ''){ ?><br /><img src="thumb.php?idServ=<?php echo $row['idServ']; ?>" width="150" height="60" /><?php ?></td>
        <td valign="top" bgcolor="#EEE"><label>
          <input type="file" name="thumb" id="thumb" />
        </label></td>
      </tr>
      <tr>
        <td colspan="2" valign="top" bgcolor="#EEE"><label>
          <input type="submit" name="guardar" id="guardar" value="Guardar" />
        </label></td>
      </tr>
    </table>
  </form>
<?php
}
?>
</div>
<?php include('incluir/pie.php'); ?>
<script type="text/javascript">
<!--
var sprytextfield1 = new Spry.Widget.ValidationTextField("sprytextfield1");
//-->
</script>
</body>
</html>

Muchas gracias. Saludos!
__________________
Facundo
http://www.creactivo.com.ar
  #2 (permalink)  
Antiguo 25/03/2010, 07:28
 
Fecha de Ingreso: septiembre-2008
Mensajes: 65
Antigüedad: 15 años, 6 meses
Puntos: 2
Respuesta: Tengo un problema al pasar archivos por un form

Hola ,

Me imagino que habras comprobado que simpre te llega la variable 'idServ' para que los updates funcionen.

Yo en principio no veo nada raro en el codigo pero te lanzo esta pregunta: ¿has probado a ejecutar el script en varios navegadores??

Te digo esto por que tengo yo una pregunta en el foro a proposito de problemas con IE al subir archivos al servidor ya que IE se empeña a decir al pasar unos segundos de espera al empezar la subida del archivo que se perdio la conexion al servidor, o como comentas se queda la pagina en blanco.

Ya me cuentas.

Un saludo.
  #3 (permalink)  
Antiguo 25/03/2010, 07:51
Avatar de fakulicious  
Fecha de Ingreso: mayo-2008
Ubicación: Mendoza
Mensajes: 140
Antigüedad: 15 años, 11 meses
Puntos: 2
Respuesta: Tengo un problema al pasar archivos por un form

Hola! Muchas gracias por responder.

Si, comprobé pasar la idServ, y la estoy pasando por GET desde el action del form:

Código HTML:
<form action="editarServicio.php?idServ=<?php echo $row['idServ']; ?>" method="post" enctype="multipart/form-data" name="form1" id="form1"> 
Ahora de otra manera conseguí que funcione la edición del campo 'imagen', así:

Código PHP:
if($_FILES['imagen']['tmp_name']){ 
pero hago exactamente lo mismo para el thumb, y no funciona. Guarda todos los otros campos, pero no guarda el thumb.

Comprobé los nombres de campos por si era un error de tipeo, y está todo ok.

Pero el sistema reacciona como si no estuviese cargando el archivo. Hace todo lo demás excepto guardar el thumb.

Estoy usando Chrome. Ahora lo voy a probar en IE, FF y Safari a ver que pasa y te lo digo. Muchas gracias.
__________________
Facundo
http://www.creactivo.com.ar
  #4 (permalink)  
Antiguo 25/03/2010, 07:55
Avatar de fakulicious  
Fecha de Ingreso: mayo-2008
Ubicación: Mendoza
Mensajes: 140
Antigüedad: 15 años, 11 meses
Puntos: 2
Respuesta: Tengo un problema al pasar archivos por un form

Lo acabo de probar en todos los exploradores (Chrome, IE, FF y Safari) y en todos ocurre lo mismo..
__________________
Facundo
http://www.creactivo.com.ar
  #5 (permalink)  
Antiguo 25/03/2010, 07:56
 
Fecha de Ingreso: septiembre-2008
Mensajes: 65
Antigüedad: 15 años, 6 meses
Puntos: 2
Respuesta: Tengo un problema al pasar archivos por un form

Hola de nuevo,

¿has comprobado que se suba tambien al temporal la miniatura?.

un saludo.
  #6 (permalink)  
Antiguo 25/03/2010, 08:11
Avatar de fakulicious  
Fecha de Ingreso: mayo-2008
Ubicación: Mendoza
Mensajes: 140
Antigüedad: 15 años, 11 meses
Puntos: 2
Respuesta: Tengo un problema al pasar archivos por un form

Beto, acabo de encontrar mi error.

Todavía no sé porque no funcionaban las condicionales anteriores, pero ahora el problema con el thumb era que al crear la imagen con GD, la creaba desde la variable del fileType en vez del tmpName

Reemplacé

Código PHP:
$thumb imagecreatefromjpeg($fileTypeThumb); 
Por:

Código PHP:
$thumb imagecreatefromjpeg($tmpNameThumb); 
:-p

Muchas gracias por la ayuda!!! Un abrazo!!
__________________
Facundo
http://www.creactivo.com.ar

Etiquetas: pasar, formulario
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 04:15.