Foros del Web » Programando para Internet » PHP »

un problema al subir archivo

Estas en el tema de un problema al subir archivo en el foro de PHP en Foros del Web. gracias al aporte de PATO 12 en la seccion "aportes" tengo el siguiente script "Subir imagen con php" lo adapte un poco a lo que ...
  #1 (permalink)  
Antiguo 29/09/2008, 11:42
 
Fecha de Ingreso: enero-2002
Ubicación: Lima
Mensajes: 461
Antigüedad: 22 años, 10 meses
Puntos: 1
un problema al subir archivo

gracias al aporte de PATO 12 en la seccion "aportes" tengo el siguiente script "Subir imagen con php" lo adapte un poco a lo que precisaba yo.
ahora se me presentan dos problemas:

1_ que pasa si quiero subir mas de un archivo que debo agregarle?

2_ tengo un error por ejemplo si subo un archivo que supera el tamaño permitido y/o no es de la extension permitida me avisa (esto funciona bien) pero igual me lo graba en la base de datos como hago para que no lo haga?

aqui dejo los archivos

formulario.html

Código PHP:
<HTML>
<HEAD>
<TITLE>Binario a BD</TITLE>
</HEAD>
<BODY>
<?php
if (isset($_GET['proceso'])){
echo 
$_GET['proceso']."<br>";
}
?>
<FORM enctype="multipart/form-data" method="post" action="insertar.php">
Archivo: <INPUT type="file" name="archivo" size="30">
<INPUT type="submit" name="submit" value="Subir archivo">
</FORM>
</BODY>
</HTML>
insertar.php
Código PHP:
<?php
//Primero, arranca el bloque PHP y checkea si el archivo tiene nombre.  Si no fue asi, te remite de nuevo al formulario de inserción:
if (empty($_FILES['archivo']['name'])){
header("location: formulario.php?proceso=falta_indicar_fichero"); //o como se llame el formulario ..
exit;
}

//establece una conexión con la base de datos.
$conexion mysql_connect("localhost","..","..") or die("No se pudo realizar la conexion con el servidor.");
mysql_select_db("imagen",$conexion) or die("No se puede seleccionar BD"); // tu_bd es el nombre de la Base de datos .. por siaca.

// archivo temporal (ruta y nombre).
$nombre_temporal=$_FILES['archivo']['tmp_name'] ;

// leer del archvio temporal...
$contenido addslashes(fread(fopen($nombre_temporal"rb"), filesize($nombre_temporal)));

// Obtener del array FILES (superglobal) los datos del archivo .. nombre, tabamo y tipo.
$nombre=$_FILES['archivo']['name'];
$peso=$_FILES['archivo']['size'];
$tipo=$_FILES['archivo']['type'];



//restringir tamaño de archivo permitido
$tamano $_FILES 'archivo' ][ 'size' ]; // Leemos el tamaño del fichero
$tamaño_max="100000"// Tamaño maximo permitido
if( $tamano $tamaño_max){ // Comprovamos el tamaño 

//guardar en carpeta
$destino 'foto' // Carpeta donde se guardata
$sep=explode('image/',$_FILES["archivo"]["type"]); // Separamos image/
$tipo=$sep[1]; // Obtenemos el tipo de imagen que es
if($tipo == "gif" || $tipo == "jpeg" || $tipo == "bmp"){ 

//nombre aleatorio por formato de tiempo unix
$image_name=time().'.'.$tipo;

//copio al directorio especificado
move_uploaded_file $_FILES 'archivo' ][ 'tmp_name' ], $destino '/' .$image_name.'.'.$tipo);  // Subimos el archivo

}
else echo 
"el tipo de archivo no es una imagen permitida";// Si no es el tipo permitido lo decimos
}
else echo 
"El archivo supera el tamaño permitido.";// Si supera el tamaño de permitido lo decimos

//insertamos los datos en la BD.
$consulta_insertar "INSERT INTO img (id, titulo, descrip, img1, img2) VALUES ('', '', '', 'foto/$image_name', '')";
mysql_query($consulta_insertar,$conexion) or die("No se pudo insertar los datos en la base de datos.");
header("location: listar_imagenes.php");  // si ha ido todo bien
exit;

?>
__________________
Marcelo Acampora
mi pagina web personal
www.destinitytravel.com
  #2 (permalink)  
Antiguo 29/09/2008, 11:46
Avatar de Marvin
Colaborador
 
Fecha de Ingreso: febrero-2005
Ubicación: global $Chile->Santiago;
Mensajes: 1.991
Antigüedad: 19 años, 9 meses
Puntos: 81
Respuesta: un problema al subir archivo

Prueba poniendole un "die()" en vez de un echo en las lineas de los mensajes:
Código PHP:
echo "el tipo de archivo no es una imagen permitida";
echo 
"El archivo supera el tamaño permitido."
Suerte!
__________________
El que dice "Solo sé que nada sé", esta asumiendo que sabe algo.
Lea las FAQ's!
  #3 (permalink)  
Antiguo 29/09/2008, 12:05
 
Fecha de Ingreso: enero-2002
Ubicación: Lima
Mensajes: 461
Antigüedad: 22 años, 10 meses
Puntos: 1
Respuesta: un problema al subir archivo

marvin me pone esto en el explorador

Parse error: syntax error, unexpected T_CONSTANT_ENCAPSED_STRING in .....\www\imagen\insertar.php on line 43

esta bien escrito lo que puse a ver

else die() "el tipo de archivo no es una imagen permitida";// Si no es el tipo permitido lo decimos
}
else die() "El archivo supera el tamaño permitido.";// Si supera el tamaño de permitido lo decimos
__________________
Marcelo Acampora
mi pagina web personal
www.destinitytravel.com
  #4 (permalink)  
Antiguo 29/09/2008, 12:17
Avatar de Marvin
Colaborador
 
Fecha de Ingreso: febrero-2005
Ubicación: global $Chile->Santiago;
Mensajes: 1.991
Antigüedad: 19 años, 9 meses
Puntos: 81
Respuesta: un problema al subir archivo

Nop... debes ponerlo asi:
Código PHP:
die("el tipo de archivo no es una imagen permitida"); 
Suerte!
__________________
El que dice "Solo sé que nada sé", esta asumiendo que sabe algo.
Lea las FAQ's!
  #5 (permalink)  
Antiguo 29/09/2008, 15:00
 
Fecha de Ingreso: enero-2002
Ubicación: Lima
Mensajes: 461
Antigüedad: 22 años, 10 meses
Puntos: 1
Respuesta: un problema al subir archivo

muchas gracias Marvin funciono!!

me falta resolver esto

como hago para subir mas de 1 archivo?
__________________
Marcelo Acampora
mi pagina web personal
www.destinitytravel.com
  #6 (permalink)  
Antiguo 29/09/2008, 17:15
Avatar de korg1988  
Fecha de Ingreso: junio-2006
Ubicación: Santa Fe, Argentina
Mensajes: 825
Antigüedad: 18 años, 4 meses
Puntos: 19
Respuesta: un problema al subir archivo

Código PHP:
<INPUT type="file" name="archivo[]" size="30">
//fijate los corchetes detras del name!.... eso marca que va a ser un array de files

//despues para leerlo solo haces asi
//un for que recorra todos los archivos subidos
for($i=0;$i<sizeof($_FILES['archivo']['name']); $i++)
{
//y para usar los datos lo haces asi
//ejemplo, para mostrar el nombre
echo $_FILES['archivo']['name'][$i];

//tambien podes pegar tu codigo aca adentro y agregar [$i] a las variables $_FILES
//espero que te sirva!

  #7 (permalink)  
Antiguo 29/09/2008, 20:51
 
Fecha de Ingreso: enero-2002
Ubicación: Lima
Mensajes: 461
Antigüedad: 22 años, 10 meses
Puntos: 1
Respuesta: un problema al subir archivo

korg1988: solo me sube a la bd y me copia a la carpeta el primer archivo que subo

no se que estoy haciendo mal aqui dejo el codigo completo

formulario:
Código PHP:
<FORM enctype="multipart/form-data" method="post" action="insertar.php">
Archivo: <INPUT type="file" name="archivo[]" size="30"><br>
Archivo: <INPUT type="file" name="archivo[]" size="30"><br>
<
INPUT type="submit" name="submit" value="Subir archivo">
</
FORM
insertar.php:

Código PHP:
<?php
//un for que recorra todos los archivos subidos
for($i=0;$i<sizeof($_FILES['archivo']['name']); $i++)
{

//Primero, arranca el bloque PHP y checkea si el archivo tiene nombre.  Si no fue asi, te remite de nuevo al formulario de inserción:
if (empty($_FILES['archivo']['name'][$i])){
header("location: imagen2.php?proceso=falta_indicar_fichero"); //o como se llame el formulario ..
exit;
}

//establece una conexión con la base de datos.
$conexion mysql_connect("localhost","..","....") or die("No se pudo realizar la conexion con el servidor.");
mysql_select_db("imagen",$conexion) or die("No se puede seleccionar BD"); // 

// archivo temporal (ruta y nombre).
$nombre_temporal=$_FILES['archivo']['tmp_name'][$i] ;

// leer del archvio temporal...
$contenido addslashes(fread(fopen($nombre_temporal"rb"), filesize($nombre_temporal)));

// Obtener del array FILES (superglobal) los datos del archivo .. nombre, tabamo y tipo.
$nombre=$_FILES['archivo']['name'][$i];
$peso=$_FILES['archivo']['size'][$i];
$tipo=$_FILES['archivo']['type'][$i];



//restringir tamaño de archivo permitido
$tamano $_FILES 'archivo' ][ 'size' ][$i]; // Leemos el tamaño del fichero
$tamaño_max="100000"// Tamaño maximo permitido
if( $tamano $tamaño_max){ // Comprovamos el tamaño 

//guardar en carpeta
$destino 'foto' // Carpeta donde se guardata
$sep=explode('image/',$_FILES["archivo"]["type"][$i]); // Separamos image/
$tipo=$sep[1]; // Obtenemos el tipo de imagen que es
if($tipo == "gif" || $tipo == "jpeg" || $tipo == "bmp"){ 

//nombre aleatorio por formato de tiempo unix
$image_name=time().'.'.$tipo;

//copio al directorio especificado
move_uploaded_file $_FILES 'archivo' ][ 'tmp_name' ][$i], $destino '/' .$image_name.'.'.$tipo);  // Subimos el archivo

}
else die(
"el tipo de archivo no es una imagen permitida") ;// Si no es el tipo permitido lo decimos
}
else die(
"El archivo supera el tamaño permitido.") ;// Si supera el tamaño de permitido lo decimos

//insertamos los datos en la BD.
$consulta_insertar "INSERT INTO img (id, titulo, descrip, img1, img2) VALUES ('', '', '', 'foto/$image_name', '')";
mysql_query($consulta_insertar,$conexion) or die("No se pudo insertar los datos en la base de datos.");
header("location: listar_imagenes.php");  // si ha ido todo bien
exit;
}
?>
puede ser que en esta linea falle??

Código PHP:
//nombre aleatorio por formato de tiempo unix
$image_name=time().'.'.$tipo
__________________
Marcelo Acampora
mi pagina web personal
www.destinitytravel.com
  #8 (permalink)  
Antiguo 30/09/2008, 05:14
Avatar de korg1988  
Fecha de Ingreso: junio-2006
Ubicación: Santa Fe, Argentina
Mensajes: 825
Antigüedad: 18 años, 4 meses
Puntos: 19
De acuerdo Respuesta: un problema al subir archivo

Código PHP:
$image_name=md5(time()).'.'.$tipo
proba asi!..., igual no crfeo que ese sea el problema, sino tiraria error en esa linea en todo caso, pero no tiene nada que ver como para que no te guarde el archivo
Proba cambiando el
Código PHP:
fopen($nombre_temporal"rb"
por
Código PHP:
fopen($nombre_temporal"r"
Igualmente sabes que podes hacer???

Intenta asi.

Primero subis el archivo al servidor, una vez que lo subis almacenas el nuevo nombre del archivo en el servidor en alguna variable, entonces despues de eso realizas el fopen para leer la informacion, pero la informacion del archivo que esta subido en el servidor!.... en una carpeta, ahora lo que haces es leer el contenido del archivo y guardarlo en la db, y luego borras usando unlink() el archivo del server!

Suerte proba asi
  #9 (permalink)  
Antiguo 30/09/2008, 07:11
 
Fecha de Ingreso: enero-2002
Ubicación: Lima
Mensajes: 461
Antigüedad: 22 años, 10 meses
Puntos: 1
Respuesta: un problema al subir archivo

definitivamente no es eso

solo me sube el primer archivo no los dos y de esta forma:

3cddd2a26267074179dedbc347f1fc11.jpeg.jpeg

algo hice mal en el bucle supongo aparte me pone dos veces la extension del archivo
__________________
Marcelo Acampora
mi pagina web personal
www.destinitytravel.com
  #10 (permalink)  
Antiguo 30/09/2008, 08:21
Avatar de korg1988  
Fecha de Ingreso: junio-2006
Ubicación: Santa Fe, Argentina
Mensajes: 825
Antigüedad: 18 años, 4 meses
Puntos: 19
Respuesta: un problema al subir archivo

estas asignando dos veces el valor $tipo
Código PHP:
//nombre aleatorio por formato de tiempo unix 
$image_name=time().'.'.$tipo
Ahi lo pones en la variable
pero en la linea siguiente lo volves a concatenar para hacer el upload! ;)
Código PHP:
//copio al directorio especificado 
move_uploaded_file $_FILES 'archivo' ][ 'tmp_name' ][$i], $destino '/' .$image_name.'.'.$tipo);  // Subimos el archivo 
tendrias que sacar la ultima parte a ese codigo

te quedaria asi
Código PHP:
 //copio al directorio especificado 
move_uploaded_file $_FILES 'archivo' ][ 'tmp_name' ][$i], $destino '/' .$image_name);  // Subimos el archivo 
saludos
  #11 (permalink)  
Antiguo 30/09/2008, 10:10
 
Fecha de Ingreso: enero-2002
Ubicación: Lima
Mensajes: 461
Antigüedad: 22 años, 10 meses
Puntos: 1
Respuesta: un problema al subir archivo

gracias .. bueno eso solucionaria la parte de la extension del archivo doble

pero no me soluciona el problema de que solo me sube 1 archivo (el 1 archivo que mando) y no los dos que subo creo que tengo mal hecho el bucle .

no puedo solucionar este problema!!
__________________
Marcelo Acampora
mi pagina web personal
www.destinitytravel.com
  #12 (permalink)  
Antiguo 30/09/2008, 14:22
Avatar de korg1988  
Fecha de Ingreso: junio-2006
Ubicación: Santa Fe, Argentina
Mensajes: 825
Antigüedad: 18 años, 4 meses
Puntos: 19
De acuerdo Respuesta: un problema al subir archivo

ANTES QUE NADA ORDENEMOS UN POCO EL CODIGO
Tendrias que empezar a tabular mas tu codigo
Asi los errores saltan de manera mas sencilla
Primera cosa que vi mal (hay varias pero no son importantes), pero algo que no tenia sentido era crear la coneccion a mysql dentro del for!... ya que por cada vuelta que el for se ejecutace iba a volver a conectarce al servidor!....
Por eso la coneccion la creamos fuera del for por unica vez y luego ejecutamos le resto del codigo....

Y por ultimo, el problema era que estabas redireccionando al final del for a otra pagina, y eso hacia que no se ejecutara mas de 1 vez, entonces si sacas ese codigo y lo pones luego de que termine el for completamente entonces te va a permitir subir todas las imagenes, y luego redireccionar

FIJATE AL FINAL DEL CODIGO COMO LO PUSE
Código PHP:
<?php
//establece una conexión con la base de datos.
$conexion mysql_connect("localhost","..","....") or die("No se pudo realizar la conexion con el servidor.");
mysql_select_db("imagen",$conexion) or die("No se puede seleccionar BD");

//un for que recorra todos los archivos subidos
for($i=0;$i<sizeof($_FILES['archivo']['name']); $i++)
{
    
//Primero, arranca el bloque PHP y checkea si el archivo tiene nombre.  Si no fue asi, te remite de nuevo al formulario de inserción:
    
if (empty($_FILES['archivo']['name'][$i])){
        
header("location: imagen2.php?proceso=falta_indicar_fichero"); //o como se llame el formulario ..
        
exit;
    }
    
    
// archivo temporal (ruta y nombre).
    
$nombre_temporal=$_FILES['archivo']['tmp_name'][$i] ;
    
    
// leer del archvio temporal...
    
$contenido addslashes(fread(fopen($nombre_temporal"rb"), filesize($nombre_temporal)));
    
    
// Obtener del array FILES (superglobal) los datos del archivo .. nombre, tabamo y tipo.
    
$nombre=$_FILES['archivo']['name'][$i];
    
$peso=$_FILES['archivo']['size'][$i];
    
$tipo=$_FILES['archivo']['type'][$i];
    
    
//restringir tamaño de archivo permitido
    
$tamano $_FILES 'archivo' ][ 'size' ][$i]; // Leemos el tamaño del fichero
    
$tamaño_max="100000"// Tamaño maximo permitido
    
    
if( $tamano $tamaño_max){ // Comprovamos el tamaño 
        
        //guardar en carpeta
        
$destino 'foto' // Carpeta donde se guardata
        
$sep=explode('image/',$_FILES["archivo"]["type"][$i]); // Separamos image/
        
$tipo=$sep[1]; // Obtenemos el tipo de imagen que es
        
        
if($tipo == "gif" || $tipo == "jpeg" || $tipo == "bmp"){ 
            
//nombre aleatorio por formato de tiempo unix
            
$image_name=time().'.'.$tipo;
            
            
//copio al directorio especificado
            
move_uploaded_file $_FILES 'archivo' ][ 'tmp_name' ][$i], $destino '/' .$image_name.'.'.$tipo);  // Subimos el archivo
        
} else {
            die(
"el tipo de archivo no es una imagen permitida") ;// Si no es el tipo permitido lo decimos
        
}
        
    } else {
        die(
"El archivo supera el tamaño permitido.") ;// Si supera el tamaño de permitido lo decimos
    
}
    
    
//insertamos los datos en la BD.
    
$consulta_insertar "INSERT INTO img (id, titulo, descrip, img1, img2) VALUES ('', '', '', 'foto/$image_name', '')";
    
mysql_query($consulta_insertar,$conexion) or die("No se pudo insertar los datos en la base de datos.");
    
    
//------------------------------------------
    //ACA ESTABA EL PROBLEMA!!!!!!!
    //------------------------------------------
    //CUANDO TERMINA LA PRIMER VUELTA DEL FOR EL SCRIPT TE DIRECCIONA A OTRA PAGINA, Y NO LO DEJA TERMINAR, ESTO TENDRIA QUE IR AFUERA DEL FOR, PARA QUE LUEGO DE QUE SE EJECUTE TODO EL FOR COMPLETO TE REDIRECCIONE...
    //Codigo anterior:
    //    header("location: listar_imagenes.php");  // si ha ido todo bien
    //    exit;
}
header("location: listar_imagenes.php");  // si ha ido todo bien
exit;
?>
Saludos!
  #13 (permalink)  
Antiguo 30/09/2008, 17:24
 
Fecha de Ingreso: enero-2002
Ubicación: Lima
Mensajes: 461
Antigüedad: 22 años, 10 meses
Puntos: 1
Respuesta: un problema al subir archivo

:apla uso:

muchisimas gracias Korg1988 agradezco mucho tu paciencia y empeño para conmigo y disculpa es que recien doy mis primeros pasos


era ese el problema desorden de codigo y un poco por novato

solo me queda un detalle:

el archivo que se guarda en Bd y en carpeta tendria que grabarse con nombre aleatorio para impedir que se sobreescriba y se porque pero no se como escribir el codigo

Código PHP:
 //nombre aleatorio por formato de tiempo unix
            
$image_name=time().'.'.$tipo;
            
            
//copio al directorio especificado
            
move_uploaded_file $_FILES 'archivo' ][ 'tmp_name' ][$i], $destino '/' .$nombre); 
la variable $image_name toma el primer archivo por es como que no esta en bucle

tendria que ser algo asi

Código PHP:
 $nombre=$_FILES['archivo']['name'][$i];

$image_name=$nombre.time().'.'.$tipo
logicamente esto esta mal escrito pero esa seria la idea
__________________
Marcelo Acampora
mi pagina web personal
www.destinitytravel.com
  #14 (permalink)  
Antiguo 30/09/2008, 17:38
 
Fecha de Ingreso: enero-2002
Ubicación: Lima
Mensajes: 461
Antigüedad: 22 años, 10 meses
Puntos: 1
Respuesta: un problema al subir archivo

bueno lo Logre!!!!!! asi lo arregle si a alguien le sirve

Código PHP:
//nombre aleatorio
            
$imagen2 rand(0,9999999999).rand(100,9999).rand(100,9999).'.'.$sep[1];
            
            
//copio al directorio especificado
            
move_uploaded_file $_FILES 'archivo' ][ 'tmp_name' ][$i], $destino '/' .$imagen2);  // Subimos el archivo 
__________________
Marcelo Acampora
mi pagina web personal
www.destinitytravel.com

Última edición por marcinf2; 30/09/2008 a las 18:29
  #15 (permalink)  
Antiguo 30/09/2008, 20:34
Avatar de korg1988  
Fecha de Ingreso: junio-2006
Ubicación: Santa Fe, Argentina
Mensajes: 825
Antigüedad: 18 años, 4 meses
Puntos: 19
Respuesta: un problema al subir archivo

jaja pero si querias tener un nombre de archivo que nunca se repita era tan simple como hacer esto

Código PHP:
//nombre aleatorio
            
$imagen2 md5(time()).'.'.$sep[1];
            
            
//copio al directorio especificado
            
move_uploaded_file $_FILES 'archivo' ][ 'tmp_name' ][$i], $destino '/' .$imagen2);  // Subimos el archivo 
ya que time() nunca se va a repetir y md5 le da un formato mas "copado" jajaj y te ahorras todo esos randoms que pusiste !

Saludos!
  #16 (permalink)  
Antiguo 01/10/2008, 07:41
 
Fecha de Ingreso: enero-2002
Ubicación: Lima
Mensajes: 461
Antigüedad: 22 años, 10 meses
Puntos: 1
Respuesta: un problema al subir archivo

gracias de vuelta Korg!!! pr la ayuda

lo voy a poner en practica!!
__________________
Marcelo Acampora
mi pagina web personal
www.destinitytravel.com
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 21:46.