Foros del Web » Programando para Internet » PHP »

problemilla con el upload

Estas en el tema de problemilla con el upload en el foro de PHP en Foros del Web. Hola de nuevo. tengo un problemilla con el upload: tengo el siguiente script Código PHP: $dir = "imatges/" ;  $max_size  =  51200 ; $msg_error = ...
  #1 (permalink)  
Antiguo 22/01/2003, 18:18
 
Fecha de Ingreso: enero-2003
Mensajes: 55
Antigüedad: 14 años, 11 meses
Puntos: 0
Pregunta problemilla con el upload

Hola de nuevo.
tengo un problemilla con el upload:

tengo el siguiente script
Código PHP:
$dir="imatges/"
$max_size 51200;
$msg_error="";
if (
is_uploaded_file($arx_foto)){
   if (
$arx_foto_size>$max_size){
      
$msg_error"Archivo demasiado grande (max. 50 KB)."
   }else{
      if ((
$arx_foto_type=="image/gif") || ($arx_foto_type=="image/pjpeg")){
         if(
$arx_foto_type=="image/gif"){
            
$ext=".gif";
         }else{
            
$ext=".jpg";
         }
         
$ID_us=$_SESSION["usuario_id"];
         
$sql="select * from usuarios where ID = $ID_us";
         
$result mysql_query($sql,$link);
         
$row=mysql_fetch_array($result);
         
mysql_free_result($result);
         
$num_foto=$row['num_fotos'];
         ++
$num_foto;
         
$nom_arxiu str_pad($num_foto,6,"0",STR_PAD_LEFT).$ext;
         
$res copy($arx_foto$dir $nom_arxiu);
         if (!
$res){
            
$msg_error"NO se ha podido copiar el archivo";
         }else{
            
$sql="update usuarios set num_fotos='$num_foto' where ID = '$ID_us'";
            
mysql_query($sql,$link);
            
$campo="foto_".$foto;
            
$sql="update tb_adults set $campo='$nom_arxiu' where id_tb_adults = '$ID'";
            
mysql_query($sql,$link);
            
$titulo="Actualizada foto $foto de: ";
         }
      }else{
         
$msg_error"Formato erroneo(solo jpeg o gif).";
      }
   }
}else{
   
$msg_error"upload fallado";

Todo parece funcionar perfectamente pero el mensaje de error en '$msg_error' es 'NO se ha podido copiar el archivo'.

He comprovado las variables y todas tienen el valor correcto.
Parece que la instruccion copy no funciona ¿pq?
La sintaxis es correcta ¿no?

¿Que hago mal?
  #2 (permalink)  
Antiguo 23/01/2003, 06:38
Avatar de BVis  
Fecha de Ingreso: noviembre-2002
Ubicación: Barcelona
Mensajes: 104
Antigüedad: 15 años, 1 mes
Puntos: 0
Seguramente no tienes permisos de escritura en el directorio de destino.
__________________
"Yo opino lo mismo que BVis, el de 'forosdelweb' " - Bill Gates
  #3 (permalink)  
Antiguo 23/01/2003, 11:34
Avatar de luigivirgo  
Fecha de Ingreso: enero-2003
Ubicación: Toluka mejiko
Mensajes: 150
Antigüedad: 14 años, 11 meses
Puntos: 0
kual es el error ke te manda

seria bueno saber ke error te sale pk estoyde akuerdo ke son permisos del directorio okambia de propietario al directorio
__________________
no olvides visitar tu propia komputadora en
http://computadora.de
http://paginaweb.de/luigivirgo/luis.jpg
  #4 (permalink)  
Antiguo 23/01/2003, 17:02
 
Fecha de Ingreso: enero-2003
Mensajes: 55
Antigüedad: 14 años, 11 meses
Puntos: 0
El script es solo una parte de la pagina que muestra las fotos que el usuario ha subido o, en su defecto, el mensaje de error que esta en '$msg_error', si es el caso.
No obtengo ningun mensaje de error de php, lo que obtengo es el mensaje NO se ha podido copiar el archivo en la pagina.
Este mensaje se lo asigno a $msg_error despues de la instruccion copy, ya que $res es falso.
¿Es posible que la configuracion de php no permita hacer un copy?
  #5 (permalink)  
Antiguo 23/01/2003, 20:15
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
En que servicio de Hosting estas usando el tema de "file Upload"? .. alguno gratuito ? .. de pago? .. tu PC? ...

Para ver el mensaje de error de PHP si lo hay .. haz una simple prueba:

Toma nota del valor que da $arx_foto y $dir.$nom_arxiu (todo concatendo estas dos ..) Y se las pasas a la funcion copy() así tal cual .. en un script tuyo de prueba ..

copy($arx_foto, $dir . $nom_arxiu);

Si hay error .. PHP deberia mostraterlo ahi .. el error sería algo como "no existe" tal .. en tal sitio (normalmente si es problema de permisos será en el directorio destino pues .. no puede crear el directorio + archivo) ..

Un saludo,
  #6 (permalink)  
Antiguo 24/01/2003, 16:52
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 15 años, 6 meses
Puntos: 16
Hola,

Puede ser que copy() necesite el path absoluto del fichero destino (path, no URL). Si la carpeta $dir cuelga del directorio raiz del sitio web, te bastaria con hacer un $DOCUMENT_ROOT.$dir.$nom_arxiu

Suerte.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #7 (permalink)  
Antiguo 24/01/2003, 17:52
 
Fecha de Ingreso: enero-2003
Mensajes: 55
Antigüedad: 14 años, 11 meses
Puntos: 0
Es curioso, hoy, sin haber modificado ni una coma del script me da este error:
Warning: open_basedir restriction in effect. File is in wrong directory in /home/webcindario/delpaquel/Lib_gestio.phtml on line 455
La linea 455 es la que contiene el copy:
Código PHP:
$res copy($arx_foto$dir.$nom_arxiu); 
y Lib_gestio.phtml el script.
¿Es un problema de permisos?. Si es asi como se hace o donde puedo encontrar info.
La pag esta en un server gratuito: miarroba.com
  #8 (permalink)  
Antiguo 24/01/2003, 18:19
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 15 años, 6 meses
Puntos: 16
open_basedir es una directiva que restringue el acceso a directorios y ficheros por encima del directorio especificado en esa directiva. Por ejemplo, si
open_basedir='/home/webcindario/'
si intentas acceder a '/home/pepepepa/' te dara ese error.

Posiblemente sea lo que te comento en el mensaje anterior mio. Como $dir="imatges/", quizas te esta intentando crear el fichero en el directorio '/imatges/", el cual se encuentra posiblemente por encima del especificado por open_basedir. Para saber el valor de open_basedir, consulta el php.ini o en su defecto el resultado de llamar a phpinfo().

Si este es el problema, posiblemente se solucione con lo que te puse antes.

Saludos.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #9 (permalink)  
Antiguo 24/01/2003, 18:49
 
Fecha de Ingreso: enero-2003
Mensajes: 55
Antigüedad: 14 años, 11 meses
Puntos: 0
josemi

Si pongo lo que tu me dices:
$DOCUMENT_ROOT.$dir.$nom_arxiu
me da este error:
Notice: Undefined variable: DOCUMENT_ROOT in /home/webcindario/delpaquel/Lib_gestio.phtml on line 455

  #10 (permalink)  
Antiguo 24/01/2003, 18:55
 
Fecha de Ingreso: enero-2003
Mensajes: 55
Antigüedad: 14 años, 11 meses
Puntos: 0
Y si pongo:
Código PHP:
$res copy($arx_foto$_SERVER["DOCUMENT_ROOT"].$dir.$nom_arxiu); 
dice que:
Warning: open_basedir restriction in effect. File is in wrong directory in /home/webcindario/delpaquel/Lib_gestio.phtml on line 455
  #11 (permalink)  
Antiguo 24/01/2003, 18:59
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 15 años, 6 meses
Puntos: 16
Extraño. Pensaba que estabas con register_globals=on. Prueba con $SERVER['DOCUMENT_ROOT'] o con $HTTP_SERVER_VARS['DOCUMENT_ROOT']. de todas formas en el manual tienes una descripcion de esas variables. Por cierto, ¿que version (CGI o modulo de apache) usas?
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #12 (permalink)  
Antiguo 24/01/2003, 19:07
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 15 años, 6 meses
Puntos: 16
Haz un
Código PHP:
echo $_SERVER["DOCUMENT_ROOT"].$dir
y mira en el phpinfo() el valor de open_basedir. Puede que DOCUMENT_ROOT este apuntando a un directorio al que no tienes acceso. Eso puede pasar si es un alojamiento compartido en que ti index esta colocada en '/home/webcindario/delpaquel/' y DOCUMENT_ROOT apunte a '/home/webcindario/' que seria la raiz de todo el hosting compartido. Si falla, puedes ponerlo "a mano" con
Código PHP:
$res copy($arx_foto'/home/webcindario/delpaquel/'.$dir.$nom_arxiu); 
si quieres meter $dir bajo 'delpaquel'. La idea del DOCUMENT_ROOT era para hacerlo mas 'portable'.

Suerte.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #13 (permalink)  
Antiguo 25/01/2003, 13:23
 
Fecha de Ingreso: enero-2003
Mensajes: 55
Antigüedad: 14 años, 11 meses
Puntos: 0
Gracias josemi

Ya no se que mas provar. Haga lo que haga sale el mismo error
Warning: open_basedir restriction in effect. File is in wrong directory in /home/webcindario/delpaquel/Lib_gestio.php on line 455
Esto es lo que dice phpinfo():

register_globals = On

open_basedir = /home/webcindario/delpaquel

DOCUMENT_ROOT = /home/webcindario
  #14 (permalink)  
Antiguo 25/01/2003, 14:21
 
Fecha de Ingreso: enero-2003
Mensajes: 55
Antigüedad: 14 años, 11 meses
Puntos: 0
Bueno, pues mirando en el foro de php de miarroba.com, he encontrado algun mensaje que dice que el copy no funciona pero que move_uploaded_file si.
voy a provarlo.
¿Algun coment?
  #15 (permalink)  
Antiguo 25/01/2003, 14:29
 
Fecha de Ingreso: enero-2003
Mensajes: 55
Antigüedad: 14 años, 11 meses
Puntos: 0
Pues si que FUNCIONA!!

Gracias a todos por vuestra ayuda.
  #16 (permalink)  
Antiguo 25/01/2003, 14:38
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 15 años, 6 meses
Puntos: 16
Hola,

Me alegro que funcione con move_uploaded_file(). La explicacion es porque open_basedir afecta a todos los accesos a ficheros, incluido el de abrir. El copy() fallaba, no por el fichero de destino (que yo me habia empeñado en que era el problema), sino porque el fichero temporal donde se almacena el fichero subido estaba en un directorio superior al de open_basedir. Pero como eso lo controla PHP, sus creadores han hecho la "trampa" de que si se puede acceder mediante move_upload_file(). Lo cual es logico, ya que esa funcion se asegurara de que solo se copia el fichero que se ha subido.

Esto demuestra que a veces no es bueno centrarse en "curar" los sintomas (lo que hice yo desde un principio) sin preocuparse de la causa concreta del fallo. Pero por lo menos espero que hayamos aprendido la leccion.

Saludos.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
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 12:42.