Foros del Web » Programando para Internet » PHP »

Move_uploaded_file y safemode PHP

Estas en el tema de Move_uploaded_file y safemode PHP en el foro de PHP en Foros del Web. hola Aunque ya he resuelto mi problema quería dejar constancia de como lo he hecho por si a alguien le pasa lo mismo que lo ...
  #1 (permalink)  
Antiguo 28/09/2009, 14:22
 
Fecha de Ingreso: mayo-2005
Mensajes: 15
Antigüedad: 19 años, 6 meses
Puntos: 0
Move_uploaded_file y safemode PHP

hola
Aunque ya he resuelto mi problema quería dejar constancia de como lo he hecho por si a alguien le pasa lo mismo que lo lea y pueda resolverlo.
Espero que la explicación sea mas o menos correcta.

He tenido un problema en el servidor de Hostalia con la creación de directorios desde PHP con la sentencia mk_dir() desde un script y luego después de subir un archivo desde un formulario en una pagina y querer moverlo a ese directorio con move_uploaded_file(), cosa que no permitía hacer.

He resuelto después de leer mucho y pegarme con ello, el problema saltándome su restricción de no poder crear carpetas nada mas que con el usuario "apache".

La solución es simple, a través de FTP con un acceso a la dirección local 127.0.0.1 creo el directorio y le doy permisos. De esta manera la carpeta la crea mi usuario y no el usuario "apache" y así cambiándole los permisos queda solucionado el problema que causa el safemode del PHP.

El problema resultaba ser:
El modo safemode del PHP comprueba el uid del creador del fichero que subo al servidor desde la pagina web y el del directorio donde lo quiero copiar, a través de la sentencia en php "move_uploaded_file" para pasar el fichero del directorio temporal a la carpeta elegida.

El uid del propietario del directorio que creaba con mk_dir() era "apache" y distinto al del fichero, por tanto y aunque era un script valido de php el que lo hacía, al ser usuarios distintos no lo permite.

De esta manera se salta esa restricción.
hacer_carpeta($dir_dest) en vez de usar mk_dir()
borrar_carpeta($dir_dest) en vez de usar rm_dir()

una mejora seria pasar los permisos como parámetro en hacer carpetas pero yo no lo he necesitado así que lo dejo como va.

os dejo parte del código que he escrito.

Cita:
function hacer_carpeta($dir_dest){
$conn_id = ftp_connect('127.0.0.1');
$login_result = ftp_login($conn_id, $usuario, $password);
if ((!$conn_id) || (!$login_result)) {echo "<br>FTP ERROR!<br>";exit;}
@ftp_pasv($conn_id, true);
$estado=true;
if (!ftp_mkdir($conn_id,$dir_dest)) /*ERROR - el directorio $dir_dest NO ha sido creado.*/
$estado=false;
if (!ftp_chmod($conn_id, 0755, $dir_dest)) /*ERROR - Los permisos no han sido cambiados*/
$estado=false;
ftp_close($ftp);
return $estado;
}
function borrar_carpeta($dir_dest){
$conn_id = ftp_connect('127.0.0.1');
$login_result = ftp_login($conn_id, $usuario, $password);
if ((!$conn_id) || (!$login_result)) {echo "<br>FTP ERROR!<br>";exit;}
@ftp_pasv($conn_id, true);
if (!ftp_rmdir($conn_id,$dir_dest)) /* directorio borrado*/
$estado=true;
else /* directorio no borrado*/
$estado=false;
ftp_close($ftp);
return $estado;
}

function dir_vacio($F_camino){
$conn_id = ftp_connect('127.0.0.1');
$login_result = ftp_login($conn_id, $usuario, $password);
if ((!$conn_id) || (!$login_result)) {echo "<br>FTP ERROR!<br>";exit;}
@ftp_pasv($conn_id, true);
$list = ftp_nlist ($conn_id, $F_camino);
if ( empty($list) ) /*directorio vacio*/
$estado=true;
else /* directorio no vacio*/
$estado=false;
ftp_close($ftp);
return $estado;
}


------------------------
las llamadas son:

/* $estado recibe el valor booleano del resultado de la operación.*/
$dir1= '/httpdocs/prueba/';
$estado=hacer_carpeta($dir1);
$estado=dir_vacio($dir1);
$estado=borrar_carpeta($dir1);
espero que esto le sirva a alguien.
saludos.

Última edición por plcabgut; 19/04/2010 a las 15:53 Razón: olvido
  #2 (permalink)  
Antiguo 28/09/2009, 14:35
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 15 años, 5 meses
Puntos: 1517
Respuesta: Move_uploaded_file y safemode PHP

Te sugiero postear el codigo, pero los http://www. separale los slash para que salga de esta forma http:/ /www.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
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 22:25.