Foros del Web » Programando para Internet » PHP »

error al subir imagenes al servidor safe mode

Estas en el tema de error al subir imagenes al servidor safe mode en el foro de PHP en Foros del Web. hola muy buenas estoy intentando subir imagenes al servidor mediante un script , en localhost funciona de maravillas, pero en un servidor de internet tienes ...
  #1 (permalink)  
Antiguo 20/04/2006, 03:46
Avatar de gachon  
Fecha de Ingreso: septiembre-2004
Ubicación: En Google
Mensajes: 462
Antigüedad: 13 años, 3 meses
Puntos: 3
error al subir imagenes al servidor safe mode

hola muy buenas estoy intentando subir imagenes al servidor mediante un script , en localhost funciona de maravillas, pero en un servidor de internet tienes safe mode a On, y no funciona,asin que he leido, lo de http://www.php.net/manual/es/features.safe-mode.php

y he entendido que los permisos deben estar todos iguales, le he puesto 0777, pero sigue dando el mismo error
Código PHP:
Warningcopy(): SAFE MODE Restriction in effectThe script whose uid is 646 is not allowed to access 
/home/---/domains/----/public_html/imagenes/16 owned by uid 48 in 
/home/----/domains/--------/public_html/clasesimg.php on line 254

Warning
copy(imagenes/16/apart.jpg): failed to open streamNo such file or directory in 
/home/----/domains/--------/public_html/clasesimg.php on line 254 
haber si alguin sabe algo mas
bueno muchas gracias y espero vuestra ayuda
saludos
  #2 (permalink)  
Antiguo 20/04/2006, 06:46
 
Fecha de Ingreso: junio-2003
Mensajes: 778
Antigüedad: 14 años, 6 meses
Puntos: 1
yo tengo el mismo problema
  #3 (permalink)  
Antiguo 20/04/2006, 09:29
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
En "safe mode" a ON .. no pueden usar copy() para mover el archivo temporal que PHP crea al subir tu archivo a su destino definitivo .. es necesario usar la función:

move_uploaded_file() .. es la única función que tiene acceso para acceder a dicho directorio "temporal" en ese tipo de configuración.

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #4 (permalink)  
Antiguo 20/04/2006, 09:52
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Por cierto . .en la documentación oficial de PHP tienen ejemplos de uso:

http://www.php.net/manual/es/features.file-upload.php

Y en las FAQ's más.

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #5 (permalink)  
Antiguo 20/04/2006, 09:55
Avatar de gachon  
Fecha de Ingreso: septiembre-2004
Ubicación: En Google
Mensajes: 462
Antigüedad: 13 años, 3 meses
Puntos: 3
muchas gracias por responder, perdon si es verdad el error me lo dava en copy en la linea 254, que pone esto,,,,,
Código PHP:
 if((empty($this->errores)) && (!copy($_FILES[$form_file_name]['tmp_name'], $this->directorio $this->nombre_archivo))) {

                
$this->AgregaError('No se ha podido subir el archivo, revise los errores previos.<br>');

            } 
pero ahora al cambiarlo por move_upload_file;
Código PHP:
 if((empty($this->errores)) && (!move_uploaded_file$this->nombre_archivo,$this->directorio ))) {

                
$this->AgregaError('No se ha podido subir el archivo, revise los errores previos.<br>');

            } 
ahora donde pongo el
Código PHP:
$_FILES[$form_file_name]['tmp_name'
muchisimas gracias espero que puedas ayudarme
  #6 (permalink)  
Antiguo 20/04/2006, 10:15
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
No sé si has leido la documentación oficial sobre "move_uploaded_file()" .. tiene LOS MISMOS parámetros que copy() .. se trata de que NO uses copy() sino "move_uploaded_file()" .. Pero también veo que estás intentando modificar un código más complejo: una classe .. así que ten cuidado en modificar algo que no sabes bien como funciona y en su defecto .. expón en el foro el código completo y en su contexto de lo que uses para que alguien lo pueda evaluar.

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #7 (permalink)  
Antiguo 20/04/2006, 10:42
Avatar de gachon  
Fecha de Ingreso: septiembre-2004
Ubicación: En Google
Mensajes: 462
Antigüedad: 13 años, 3 meses
Puntos: 3
perdona pero si me lo habia leido, es que como ponia
para copy
Código PHP:
copy string origenstring destino 
para move_upload_file
Código PHP:
move_uploaded_file string nombre_archivostring destino 
a lo mejor no lo habia entendido bien, pero al ver lo que tu me has dicho y los ejemplos para ser que si usa los mismos parametros
esta la clase de special; solo he cambiado copy por move_uploada_file
Código PHP:

<?php

    
//----------------------------------------------------------------------------------------------------------CLASE

    
class FileUpLoad {

        
//------------------------------------------------------PROPIEDADES

        
var $directorio;
        var 
$nombre_archivo;
        var 
$repetido;
        var 
$tipos_validos;
        var 
$crea_direcotorios;
        var 
$permisos_direcotorios;
        var 
$max_weight;
        var 
$min_weight;
        var 
$errores;


        
//------------------------------------------------------METODO

        
function InicializaErrores() {

            
$this->errores '';

        }


        
//------------------------------------------------------METODO

        
function AgregaError($error) {

            
$this->errores .= $error;

        }


        
//------------------------------------------------------METODO

        //vasado en el script encontrado en php.net en la función con cabecera (andrei at bizland dot ro 24-Oct-2004 06:33)
        
function CreaDirectorioRecursivo($dir$permisos) {

            if (
file_exists($dir)) return false;

            
preg_match_all('/([^\/]*)\/?/i'$dir$atmp);

            
$base '';

            foreach (
$atmp[0] as $directorio) {

                
$base .= $directorio;
                if((!
file_exists($base)) && (!mkdir($base$permisos))) return false;

            }

            return 
false;
    
        }


        
//------------------------------------------------------METODO

        
function ExisteArchivo($nombre_archivo) {

            if(
$this->nombre_archivo$nombre_archivo $this->nombre_archivo;

            switch(
$this->repetido) {

                
//sobreescribir
                
case 1: {

                    
$this->nombre_archivo $nombre_archivo;
                    break;

                }
                
//copiar con nuevo nombre
                
case 2: {

                    
$array_partes explode('.'$nombre_archivo);

                    if((
count($array_partes)) > 1) {

                        
$extension '.' implode('.'array_slice($array_partes1));
                        
$nombre $array_partes[0];

                    }
                    else {

                        
$extension '';
                        
$nombre $nombre_archivo;

                    }

                    
$nombre_temp $nombre $extension;
                    
$i 0;
                    while(
file_exists($this->directorio $nombre_temp)) {

                        
$nombre_temp $nombre '_' $i $extension;
                        
$i++;

                    }

                    
$this->nombre_archivo $nombre_temp;

                    break;

                }
                
//abortar si el fichero existe
                
default : {

                    if(
file_exists($this->directorio $nombre_archivo)) return false;

                    return 
true;
                    break;

                }

            }

            return 
true;

        }


        
//------------------------------------------------------METODO

        
function CrearDirectorios($permisos 0777) {

            
$this->crea_direcotorios true;
            
$this->permisos_directorios $permisos;
            return 
true;

        }


        
//------------------------------------------------------METODO

        
function NombreDeArchivo($nombre) {

            
$this->nombre_archivo $nombre;
            return 
true;

        }


        
//------------------------------------------------------METODO

        
function TiposValidos($array_tipos) {

            if(
is_array($array_tipos)) $this->tipos_validos $array_tipos;
            return 
false;

        }


        
//------------------------------------------------------METODO

        
function PesoMaximo($peso) {

            
$this->max_weight $peso 1024;
            return 
true;

        }



        
//------------------------------------------------------METODO

        
function PesoMinimo($peso) {

            
$this->min_weight $peso 1024;
            return 
true;

        }



        
//------------------------------------------------------METODO

        
function SiArchivoExiste($repetido) {

            
$this->repetido $repetido;
            return 
true;

        }


        
//------------------------------------------------------METODO

        
function EstableceDirectorio($dir) {

            
//si no existe el directorio, deseamos crearlo, y lo creamos satisfactoriamente, o si el directorio existe y es escribible
            
if(((!file_exists($dir)) && ($this->crea_direcotorios == 1) && ($this->CreaDirectorioRecursivo($dir0777))) || ((is_dir($dir)) && (is_writable($dir)))) {

                
$this->directorio $dir;

            }

            return 
true;

        }


        
//------------------------------------------------------METODO

        
function Subir($form_file_name$permisos 0777$nombre '') {

            
$this->InicializaErrores();

            if(!empty(
$nombre)) $this->NombreDeArchivo($nombre);

            if(!isset(
$_FILES[$form_file_name])) {

                
$this->AgregaError('No se ha recibido ningún archivo.<br>');

            }
            
            if(!
$this->ExisteArchivo($_FILES[$form_file_name]['name'])) {

                
$this->AgregaError('El archivo ya existe y no está habilitada la opción de sobreescribir.<br>');

            }

            if(
$_FILES[$form_file_name]['error'] != 0) {

                
$this->AgregaError('El archivo no se ha recibido correctamente.<br>');

            }

            if(!
$this->directorio) {

                
$this->AgregaError('No tiene permisos para escribir en el directorio seleccionado o para crearlo.<br>');

            }

            if((
$this->min_weight) && ($_FILES[$form_file_name]['size'] < $this->min_weight)) {

                
$this->AgregaError('El tamaño del archivo no supera el mínimo permitido.<br>');

            }

            if((
$this->max_weight) && ($_FILES[$form_file_name]['size'] > $this->max_weight)) {
    
                
$this->AgregaError('El tamaño del archivo es superior al máximo permitido.<br>');

            }

            if((
$this->tipos_validos) && (!in_array($_FILES[$form_file_name]['type'], $this->tipos_validos))) {

                
$this->AgregaError('El tipo de archivo enviado no es válido.<br>');

            }

            if((empty(
$this->errores)) && (!move_upload_file($_FILES[$form_file_name]['tmp_name'], $this->directorio $this->nombre_archivo))) {

                
$this->AgregaError('No se ha podido subir el archivo, revise los errores previos.<br>');

            }

            if(!empty(
$this->errores)) return $this->errores;

            
chmod($this->directorio $this->nombre_archivo$permisos);

            return 
true;

        }

    }

?>
y asin llamo a la clase;
Código PHP:
$obj_1 = new FileUpLoad;

    
//añadirmos la opción para la creación de directorios
    //especificando los permisos que le asignaremos
    
$obj_1->CrearDirectorios(0777);

    
//establecemos el directorio dónde subiremos las fotos
    //damos por hecho que la variable $id ya la habíamos obtenido previamente
    
$obj_1->EstableceDirectorio("imagenes/$ult_id/");

    
//en el caso de que el archivo exita lo reombramos
    
$obj_1->SiArchivoExiste(2);



    
//declaramos los tamaños mayor y menor (en kb) para cada archivo a subir
    
$obj_1->PesoMaximo(250);
    
    
// leer del archvio temporal .. el binario subido.
// "rb" para Windows .. Linux parece q con "r" sobra ...
$obj_1->subir('Foto1'0773,"$nombre1");
$obj_1->subir('Foto2'0773,"$nombre2");
$obj_1->subir('Foto3'0773,"$nombre3");
$obj_1->subir('Foto4'0773,"$nombre4");
$obj_1->subir('Foto5'0773,"$nombre5");
$obj_1->subir('Foto6'0773,"$nombre6");
$obj_1->subir('Foto7'0773,"$nombre7");
$obj_1->subir('Foto8'0773,"$nombre8");
$obj_1->subir('Foto9'0773,"$nombre9");
$obj_1->subir('Foto10'0773,"$nombre10"); 
bueno aqui esta el codigo a ver si podeis ayudarme
saludos
  #8 (permalink)  
Antiguo 20/04/2006, 10:44
Avatar de gachon  
Fecha de Ingreso: septiembre-2004
Ubicación: En Google
Mensajes: 462
Antigüedad: 13 años, 3 meses
Puntos: 3
ahora solo me tira este error
Código PHP:
Warningmove_uploaded_file(): SAFE MODE Restriction in effectThe script whose uid is 646 is not allowed to access /home/---/domains/----/public_html/imagenes/27 owned by uid 48 in /home/----/domains/-----/public_html/clasesimg.php on line 254 
gracias y saludos
  #9 (permalink)  
Antiguo 20/04/2006, 11:20
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Y tu formulario donde selecionas tus imagenes?

El error que te dá textual es:
/home/---/domains/----/public_html/imagenes/27

Sobre todo por ese "27" suelto ahí .. (eso es un directorio?)

Intenta ver que obtienes en el array $_FILES completo .. así sabras si el archivo es por lo menos ubicado y con que nombre "temporal" en el directorio que PHP tiene asignado (por configuración) para ese caso.

Código PHP:
<?
echo "<pre>";
print_r($_FILES);
echo 
"</pre>";
Por otro lado .. cuando uno trabaja con "safe mode" a on .. PHP se pone altamente restrictivo .. sobre todo en cuanto a permisos de acceso a archivos ..

Cuando PHP crea directorios (con las funciones adecuadas) se quedan creados bajo el usuario que use PHP. Si usas PHP como "módulo" de Apache será el usuario que use Apache .. si usas PHP como CGI será el que use este. En definitiva eso es lo que valida "safe mode" y lo que te ocasiona todos los problemas.

Por ejemplo si subes archivos por FTP¨.. quedaran bajo ese UID y no podrás accederlos por scripts PHP por ejemplo .. (ten cuidado con eso).

Para solventar esto .. (creo . no lo he probado) que tienes que hacer un "touch()" al directorio (ruta absoluta) que creas tras tu mkdir() que lo crea.

Te recomiendo leer sobre "safe mode" en:
http://es2.php.net/features.safe-mode


Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #10 (permalink)  
Antiguo 20/04/2006, 11:59
Avatar de gachon  
Fecha de Ingreso: septiembre-2004
Ubicación: En Google
Mensajes: 462
Antigüedad: 13 años, 3 meses
Puntos: 3
mas o menos ya se por donde vas los tiros, lo que pasa no se como solucionarlo,,
---antes de nada lo del 27 es la carpeta que me crea con el ultimo id generado por el envio del formulario asin meto dentro las imagenes en esa carpeta,
---la verdad es que me crea la carpeta, pero no me deja meter las imagenes dentro de
la carpeta (con el ultimo id generedo), dandome ese error comentado antes,,
------------
move_uploaded_file(): SAFE MODE Restriction in effect. The script whose uid is 646 is not allowed to access /home/---/domains/----/public_html/imagenes/27 owned by uid 48 in /home/----/domains/-----/public_html/clasesimg.php on line 254
------------
---he probado ha desactivar lo de crearme la carpeta, y meter las fotos en una carpeta que no esta creada por php, en donde tengo las imagenes de la web, y Si si me deja enviarlas hay,
---asin que el problema es de carpetas y permisos, por ejemplo cuando creo una carpeta con php y le doy permisos 0777, no me lo pone asin, es mas, entro por ftp y miro los permisos de esa carpeta creada y estan en 0755, y tambien cuando intento carbiar los permisos por ftp tampoco me deja carmbiarlos
---otra cosa a ver si he entendido bien,me estas diciendo que darles permisos via web o php es distinto que por ftp?
dios mio que lio

bueno muchas gracias y espero que me aportes un granito de arena mas para ayudarme
saludos
  #11 (permalink)  
Antiguo 20/04/2006, 12:12
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Cita:
otra cosa a ver si he entendido bien,me estas diciendo que darles permisos via web o php es distinto que por ftp?
dios mio que lio
Pues si .. Pero esto no es própio de PHP sino de como funcinoa un sistema de archivos en Linux (o *NIX). PHP queda instalado bajo cierto usuario de ese sistema operativo (ya te comenté que si PHP está instalado como módulo de Apache será el usuario que use Apache y si es por CGI será el que se defina para eso (tal vez un "nobody" normalmente)) .. Si tu entras por FTP a tu sitio .. TIENES otro usuario (el que te autentificas) .. así que cada uno está creando archivos BAJO su UID y .. si dices que todo te queda en 0755 .. revisa en un manual de UNIX que significa eso (yo no domino mucho el tema de "memoria" ..). Pero lo más probable es que tengas permiso sólo el que creó el archivo .. pero no "todos" o no están ambos usuarios en el mismo "grupo".

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
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:20.