Foros del Web » Programando para Internet » PHP »

Validar una subida de archivo

Estas en el tema de Validar una subida de archivo en el foro de PHP en Foros del Web. hola progrmadores. kiero validar un upload y me da un error tengo mi archivo formulario.php Código PHP: <HTML>  <HEAD>  <TITLE>Binario a BD</TITLE>  </HEAD>  <BODY>  <?php  if (isset( $_GET ...
  #1 (permalink)  
Antiguo 30/09/2006, 11:17
 
Fecha de Ingreso: septiembre-2006
Mensajes: 196
Antigüedad: 17 años, 6 meses
Puntos: 0
Validar una subida de archivo

hola progrmadores. kiero validar un upload y me da un error

tengo mi archivo formulario.php
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">

<p>Archivo: <INPUT type="file" name="archivo" size="30"> 
<INPUT type="submit" name="submit" value="Subir archivo"> 
</p></FORM> 
</BODY> 
</HTML>
e insertar.php
Código PHP:
<?php 
include"conexion.php";

/************************************************************************/
$uploadDir 'C:\apache\htdocs\foto'//SUPONGO ESTARA BIEN MI RUTA EL EJ. TENIA '/var/www/uploads/';

$uploadFile $uploadDir $_FILES['archivo']['name'];
print 
"<pre>";
if (
move_uploaded_file($_FILES['archivo']['tmp_name'], $uploadFile))
{
    print 
"File is valid, and was successfully uploaded. ";
    print 
"Here's some more debugging info:";
    
print_r($_FILES);
}
else
{
    print 
"Possible file upload attack!  Here's some debugging info:";
    
print_r($_FILES);
}
print 
"</pre>";
/*************************************************************************/


//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: 
// No se comprueba aqui si se ha subido correctamente. 
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. 
//PUSE MI INCLUDE AL INICIO

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

// leer del archvio temporal .. el binario subido. 
// "rb" para Windows .. Linux parece q con "r" sobra ... 
$binario_contenido addslashes(fread(fopen($binario_nombre_temporal"rb"), filesize($binario_nombre_temporal))); 

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

//insertamos los datos en la BD. 
$consulta_insertar "INSERT INTO archivos (id, archivo_binario, archivo_nombre, archivo_peso, archivo_tipo) VALUES ('', '$binario_contenido', '$binario_nombre', '$binario_peso', '$binario_tipo')"
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; 
?>
lo que esta entre * es de una funcion aparte para validar el upload y kiero integrarla porque si no no puedo subir mi foto, pero al ejecutarlo me da este error:
Warning: Cannot add header information - headers already sent by (output started at C:\apache\htdocs\foto\insertar.php:8) in C:\apache\htdocs\foto\insertar.php on line 27

como puedo solucionarlo? PD:estoy usando phptriad 2.11.
  #2 (permalink)  
Antiguo 30/09/2006, 11:32
 
Fecha de Ingreso: octubre-2003
Ubicación: Veracruz, México
Mensajes: 169
Antigüedad: 20 años, 6 meses
Puntos: 0
Ese error te lo está marcando por que estás imprimiendo codigo HTML antes de enviar una información de cabeceras HTTP.

header es una función para redireccionar a nivel de cabeceras HTTP las cuáles terminan su envío con la primera instrucción HTML o texto que se imprima en la página.

Trata de no imprimir texto antes del header, o si lo requieres puedes usar la funciones ob_start() y ob_end_flush para delimitar un bloque que se envia primero al buffer de salida y luego al navegador .

Para mayor información puedes consultar la documentación oficial:

http://www.php.net/manual/en/ref.outcontrol.php

Suerte y saludos
  #3 (permalink)  
Antiguo 30/09/2006, 12:11
 
Fecha de Ingreso: septiembre-2006
Mensajes: 196
Antigüedad: 17 años, 6 meses
Puntos: 0
xicas ray_rockus ese era un error que me salia en otras partes tambien no tenia idea que significaba (en realidad no lo busque :D) ya lo solucione.

ahora modifique mi insertar.php anterior por este:
Código PHP:
<?php 

$uploadDir 
'C:/apache/htdocs/foto'//¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿ASI ESCRIBO MI RUTA???????????????????????????
$uploadFile $uploadDir $_FILES['archivo']['name'];

if (
move_uploaded_file($_FILES['archivo']['tmp_name'], $uploadFile))
{
//establece una conexión con la base de datos. 
include"conexion.php";

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

// leer del archvio temporal .. el binario subido. 
// "rb" para Windows .. Linux parece q con "r" sobra ... 
$binario_contenido addslashes(fread(fopen($binario_nombre_temporal"rb"), filesize($binario_nombre_temporal))); 

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

//insertamos los datos en la BD. 
$consulta_insertar "INSERT INTO archivos (id, archivo_binario, archivo_nombre, archivo_peso, archivo_tipo) VALUES ('', '$binario_contenido', '$binario_nombre', '$binario_peso', '$binario_tipo')"
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; 

}
else
{
header("location: formulario.php?proceso=falta_indicar_fichero"); //o como se llame el formulario .. 
exit;
}

?>
pero me sigue enviando al header. k hago?? marque mi ruta con una pregunta para que la veansi esta bien

Última edición por gazuzax; 30/09/2006 a las 12:26
  #4 (permalink)  
Antiguo 30/09/2006, 12:58
 
Fecha de Ingreso: octubre-2003
Ubicación: Veracruz, México
Mensajes: 169
Antigüedad: 20 años, 6 meses
Puntos: 0
OK, bueno para empezar, veo por la ruta que estás en un sistema operativo Windows, no es obligatorio decirle con tanta exactitud donde está el archivo, más bien, formalmente diciendo que ocupes una ruta absoluta, opta mejor por una ruta relativa.

Pregunta: Quieres colocar tus archivos dentro de la carpeta fotos ? Si es así, te falta la diagonal entre fotos y el nombre de tu archivo.

Algo así:

Código PHP:

$uploadDir 
'foto/'//En rutas relativas no se usa la diagonal invertida  que emplean los sistemas operativos  Winbugs

$uploadFile $uploadDir $_FILES['archivo']['name']; 

/*Nota: Recuerda que foto debe ser un directorio que DEBE encontrarse  dentro de la carpeta que esté declarada  como el DocumentRoot de tu servidor Apache*/ 
En caso de que quiera llamar al archivo "foto" y le concatenas el nombre del archivo, solo cerciorate de estar en un directorio donde el servidor Web pueda escribir datos.

Observación, en el momento en que se ejecuta un header, el script que lo ejecuta (en este caso insertar.php) pierde el control de la ejecución y se lo pasa al siguiente script por lo que no veo mucho el caso del exit que colocas despues de ambos header.

Saludos y suerte
  #5 (permalink)  
Antiguo 30/09/2006, 13:23
 
Fecha de Ingreso: septiembre-2006
Mensajes: 196
Antigüedad: 17 años, 6 meses
Puntos: 0
xcias de nuevo por tu respuesta me dejaste super claro, pero ahora tengo otra duda, yo instale el phptriad y supongo que la carpeta de DocumentRoot es htdocs por default, ahi gurado mis carpetas para montar mis paginas como viste. si no es asi com veo cual es la k tiene apache para cambiarla?
  #6 (permalink)  
Antiguo 01/10/2006, 08:09
 
Fecha de Ingreso: septiembre-2006
Mensajes: 196
Antigüedad: 17 años, 6 meses
Puntos: 0
k alguien k me diga la ruta porfavor...
  #7 (permalink)  
Antiguo 01/10/2006, 08:15
Avatar de darkasecas  
Fecha de Ingreso: marzo-2005
Ubicación: SantaCata, NL, Mexico
Mensajes: 1.553
Antigüedad: 19 años, 1 mes
Puntos: 77
Pues si ahi guardas tus paginas y funcionan debe estar bien, pero igual lo puedes ver en el archivo de configuracion de apache (conf/httpd.conf), solo busca DocumentRoot
  #8 (permalink)  
Antiguo 01/10/2006, 10:25
 
Fecha de Ingreso: septiembre-2006
Mensajes: 196
Antigüedad: 17 años, 6 meses
Puntos: 0
muchas xcias darksecas me has ayudado mucho , como supuse la ruta estaba bien, el error tiene k estar en mi codigo.
  #9 (permalink)  
Antiguo 01/10/2006, 10:57
Avatar de darkasecas  
Fecha de Ingreso: marzo-2005
Ubicación: SantaCata, NL, Mexico
Mensajes: 1.553
Antigüedad: 19 años, 1 mes
Puntos: 77
Y checaste si entra al if? si guarda los datos en la base de datos?
  #10 (permalink)  
Antiguo 01/10/2006, 13:44
 
Fecha de Ingreso: septiembre-2006
Mensajes: 196
Antigüedad: 17 años, 6 meses
Puntos: 0
no, no guardo nada :@
  #11 (permalink)  
Antiguo 01/10/2006, 13:51
Avatar de darkasecas  
Fecha de Ingreso: marzo-2005
Ubicación: SantaCata, NL, Mexico
Mensajes: 1.553
Antigüedad: 19 años, 1 mes
Puntos: 77
Yo creo que tienes un error en la consulta, entonces ahi te esta mandando el error de sql y luego manda el header, por eso te marca el error que dices
En el insert tienes que en el id inserte '', si es un campo autonumerico no es necesario que lo pongas, quedaria asi
Código PHP:
$consulta_insertar "INSERT INTO archivos (archivo_binario, archivo_nombre, archivo_peso, archivo_tipo) VALUES ('$binario_contenido', '$binario_nombre', '$binario_peso', '$binario_tipo')"
  #12 (permalink)  
Antiguo 01/10/2006, 15:28
 
Fecha de Ingreso: septiembre-2006
Mensajes: 196
Antigüedad: 17 años, 6 meses
Puntos: 0
no me habia dado cuenta, tendre que ponerle un id en vez de quitarlo porque en mi tabla esta como not null.

********************EDITADO*********************** **********
les dejo todo el scprit necesario para k puedan ejecutarlo, ya solucione el problema del id, ahora puede ingresarlo, (lo deje como text para k lo puedan ver)
PERO TODAVIA ME MANDA A header("location: formulario.php?proceso=falta_indicar_fichero"); kien puede encontrar el error de la validacion??

formulario.php
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">
  <?php
include "conexion.php";
$result mysql_query("SELECT * FROM archivos"$conexion);
if (
$row mysql_fetch_array($result)){

   
$sql="SELECT (max(id)+1) as nuevoid FROM archivos";
   
$rs=mysql_query($sql);
   
$fila=mysql_fetch_assoc($rs);
   
$nuevoid=$fila['nuevoid'];
   }
  else{
    
$nuevoid 1
   }
?>
  <p>Archivo: 
    <input type="text" name="id" value="<?php echo $nuevoid;?>" >
    <INPUT type="file" name="archivo" size="30">
    <INPUT type="submit" name="submit" value="Subir archivo">
  </p>
</FORM> 
</BODY> 
</HTML>
insertar.php aqui esta el codigo que estaba cambiando
Código PHP:
<?php 
$uploadDir 
'foto/'// AQUI DEBEN PONE LA RUTA QUE UDS TENGAN
$uploadFile $uploadDir $_FILES['archivo']['name'];

if (
move_uploaded_file($_FILES['archivo']['tmp_name'], $uploadFile))
{
//establece una conexión con la base de datos. 
include"conexion.php";
// archivo temporal (ruta y nombre). 
$binario_nombre_temporal=$_FILES['archivo']['tmp_name'] ; 

// leer del archvio temporal .. el binario subido. 
// "rb" para Windows .. Linux parece q con "r" sobra ... 
$binario_contenido addslashes(fread(fopen($binario_nombre_temporal"rb"), filesize($binario_nombre_temporal))); 

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

//insertamos los datos en la BD. 
$consulta_insertar "INSERT INTO archivos (id, archivo_binario, archivo_nombre, archivo_peso, archivo_tipo) VALUES ('$id', '$binario_contenido', '$binario_nombre', '$binario_peso', '$binario_tipo')"

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; 
}
else
{
header("location: formulario.php?proceso=falta_indicar_fichero"); //o como se llame el formulario .. 
exit;
}
?>
listar_imagenes.php
Código PHP:
<?php 
include"conexion.php";

    
$sql "SELECT id,archivo_nombre,archivo_tipo,archivo_peso FROM archivos"
    
$consulta mysql_query($sql) or die ("No se pudo ejecutar la consulta"); 

    While (
$registro=mysql_fetch_assoc($consulta)){ 
        echo 
"<img src=\"ver.php?id=".$registro['id']."\">"
        echo 
"<br> Nombre archivo: ".$registro['archivo_nombre']; 
        echo 
"<br> Tipo archivo (MIME formato): ".$registro['archivo_tipo']; 
        echo 
"<br> Peso: ".$registro['archivo_peso']." bytes.<br><br>"
    } 

?>
Cita:
CREATE TABLE archivos (
id int(10) unsigned NOT NULL,
archivo_binario blob NOT NULL,
archivo_nombre varchar(255) NOT NULL default '',
archivo_peso varchar(15) NOT NULL default '',
archivo_tipo varchar(25) NOT NULL default '',
PRIMARY KEY (id)
) TYPE=MyISAM;

Última edición por gazuzax; 01/10/2006 a las 18:13
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 06:39.