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:
espero que esto le sirva a alguien. 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);
$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);
saludos.