Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

arreglo de objetos(imagenes) para subir a un servidor

Estas en el tema de arreglo de objetos(imagenes) para subir a un servidor en el foro de Frameworks y PHP orientado a objetos en Foros del Web. hola foro, de antemano pido una disculpa por si el nombre de mi tema no es el mas adecuado, en realidad no sabia como categorizarlo. ...
  #1 (permalink)  
Antiguo 08/01/2008, 12:13
Avatar de lacho  
Fecha de Ingreso: enero-2008
Mensajes: 26
Antigüedad: 16 años, 3 meses
Puntos: 0
Pregunta arreglo de objetos(imagenes) para subir a un servidor

hola foro, de antemano pido una disculpa por si el nombre de mi tema no es el mas adecuado, en realidad no sabia como categorizarlo.

pues primeramente revise todo lo que habia de arreglos de objetos aqui en el foro, y pues soy novato en esto de php, y pues estoy desarrollando un sitio con POO digo yo verdad.

bueno pero la cuestion es las siguiente,mi sitio debe de poder publicar articulos pero esto articulos podran tener imagenes, entonces tengo una clasesita que me permite subir archivos y lo hago asi porque para lo que hago es de gran importancia la calidad de la imagen, pues bien entonces yo lleno los campos del articulo y por alli hay un iconito que me permite cargar un formulario para adjuntar las imagenes pero yo lo que quiero es que me guarde esas imagenes en memoria y subirlas y registrar la referencia a que articulo pertenecen hasta que guarde el articulo, no antes, bueno esta pantalla es la del articulo, luego doy al link señalado en esta imagen



y luego aparece esto la siguiente imagen:


pues bien en este formulario puedo poner mas de una imagen generando como el efecto de adjunto de gmail, pues al darle enviar se ejecuta el siguiente script:
Código PHP:
<?php 
include("archivo.inc.php");

   
//Preguntamos si nuetro arreglo 'archivos' fue definido
 
if (isset ($_FILES["archivos"])) {
              
    
$files = array();
    foreach (
$_FILES['archivos'] as $k => $l) {
        foreach (
$l as $i => $v) {
            if (!
array_key_exists($i$files)) 
                
$files[$i] = array();
            
$files[$i][$k] = $v;
            
        }
    }
    
  
   
$j=0;
   
session_start();
   
$_SESSION['img']=array();
   foreach (
$files as $file) {
    
      
        
$img = new Archivo($file);
        
$img->comentario($_POST["descripcion"][$j]);
        
//$img->Subir("art_imagenes"); este metodo sube el archivo en el directorio que se le indica.
           
$_SESSION['img'][$j]=$img;
        
$j++;
        
   }
   
}    
?>
y como pueden ver comento la ejecucion de subir porque sin hacer un arreglo yo puedo en ese momento subir a mi servidor cada instancia, pero no es lo que yo necesito hacer(esto lo menciono porque la clase si funciona). bueno entonces si se interpreta el codigo tal como esta me dice que no se puede usar un array para este objeto. ¿como puedo implementar mi idea?.

y aqui muestro donde deseo subir las imagenes y luego guardar la referencia:
Código PHP:
<?
include("seguridad.php");
include(
"clase_articulo.php");


session_start();

$codart=articulo::generarcodigo();
$art=new articulo($codart,$_POST['tituloart'],$_POST['subtema'],$_SESSION['usuario_actual']['usuario'],$_POST['fecha'],$_POST['contenido'],$_POST['estado']/*,$_SESSION['img']*/);
$resultado=$art->guardar();
echo 
"aki guarda el articulo<br>";
$tot=2/*count($_SESSION['img'])*/;
echo 
"conto?: ".$tot;
    for (
$i=0;$i<$tot;$i++)/* esto no se ejecuta por lo mismo anterior, pero no se si la idea deberia ser asi de poderse implementar la cuestion de los arreglos*/
    
{
        
$ruta="art_imagenes";
        
$_SESSION['img'][$i]->Subir("art_imagenes");/*segun yo esto deberia accesar a una instancia archivo y subirla en el direcctorio indicado*/
        
$_SESSION['img'][$i]->guardar($i,"art_imagenes","es algo"/*$_SESSION['img'][$i]->darcomentario()*/,$_POST['fecha'],$codart);/* esto me guarda la referencia en la base de datos, es decir a que articulo estan adjunta(s) la(s) imagen(es) y la ubicacion que tienen, que no es mas que un insert into... y para ello se le pasan estos parametros al metodo de la instancia*/
        //print_r($_SESSION['img']);
    
}

$tipo="articulo";

if (!
$resultado)
{
header("Location: http://localhost/error.php?msj=".$tipo);
}
else 
{
header("Location: http://localhost/exito.php?msj=".$tipo);}
?>
lo que hago aqui es posible?

de antemano muchas gracias! ya tengo un par de dias intentando desarrolar esto y todavia no he podido.

Última edición por lacho; 08/01/2008 a las 12:20 Razón: errores y faltantes
  #2 (permalink)  
Antiguo 08/01/2008, 15:27
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Re: arreglo de objetos(imagenes) para subir a un servidor

Podrias publicar el codigo de tu clase archivo? Asi podriamos ver el error mas claramente, actualmente no se si sea posible pasar instancias de archivos temporales en una sesion, creo hay una limitante (el garbage_collector de PHP limpia todo esto al finalizar la ejecucion de tu script), por lo que si estas pasando la instancia temporal no te va a funcionar de la forma que lo estas planteando.

Saludos y bienvenido al foro.
  #3 (permalink)  
Antiguo 08/01/2008, 18:58
Avatar de lacho  
Fecha de Ingreso: enero-2008
Mensajes: 26
Antigüedad: 16 años, 3 meses
Puntos: 0
Re: arreglo de objetos(imagenes) para subir a un servidor

aqui esta el codigo que me pedias
Código PHP:
?

include(
"conexion.php");

class 
Archivo {
    private 
$Nombre;
    private 
$Tipo;
    private 
$Temporal;
        private 
$Comentario;
    private 
$Ruta;
    private  
$tamanio;
    
    
    function 
Archivo($archivoEnviado) {
        
$this->Nombre=$archivoEnviado['name'];
        
$this->Tipo=$archivoEnviado['type'];
        
$this->Temporal=$archivoEnviado['tmp_name'];        
        
$this->tamanio=$archivoEnviado['size'];
    }
    
    public function 
comentario($elcomentario)
    {
        
$this->Comentario=$elcomentario;
    }
    
    public function 
darcomentario()
    {
        return 
$this->Comentario;
    }
    
    public function 
dartipo()
    {
        return 
$this->Tipo;
    }
    
    public function 
dartamanio()
    {
        return 
$this->tamanio;
    }
    
    public function 
guardar($codimg,$ruta,$descripcion,$fecha,$codart)
    {
        
$sql="insert into imagen values('$codimg',$ruta','$descripcion','$fecha','$codart')";
        
$resultado=mysql_query($sql);
        
mysql_close(); 
        return 
$resultado;
    }
    
    
    public function 
darnombre()
    {
        return 
$this->Nombre;
    }
    
    function 
esValido() {
        
        if (
strpos($this->Tipo,"jpeg") || strpos($this->Tipo,"png") || strpos($this->Tipo,"gif") || strpos($this->Tipo,"bmp"))
            return 
true;
        else 
            return 
false;
    }
    
    function 
Subir($ruta) {
        
$this->Ruta=$ruta;
        if (
move_uploaded_file($this->Temporal,$this->Ruta."/".$this->Nombre))
            return 
true;
        else
            return 
false;
    }
    
    function 
Borrar() {
        if (@
unlink($this->Ruta."/".$this->Nombre))
            return 
true;
        else
            return 
false;
    }
}

?> 
  #4 (permalink)  
Antiguo 08/01/2008, 19:15
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Re: arreglo de objetos(imagenes) para subir a un servidor

Entonces si es valido lo que te comentaba, cuando tu pasas una referencia aun archivo temporal, este es borrado en cuanto termina el script (o cierras tu ventana).

Saludos.
  #5 (permalink)  
Antiguo 08/01/2008, 19:22
Avatar de lacho  
Fecha de Ingreso: enero-2008
Mensajes: 26
Antigüedad: 16 años, 3 meses
Puntos: 0
Re: arreglo de objetos(imagenes) para subir a un servidor

alguna otra idea gatorv de como puedo desarrollar lo que intento, es decir no debo subir las imagenes e insertar en la tabla imagen hasta que se inserte el articulo primero porque se relaciona con la tabla bodega y como se ve en el codigo necesito el codigo del articulo que se inserta, igual alli pensaba usar transacciones aunque solo son dos consultas.
  #6 (permalink)  
Antiguo 08/01/2008, 19:24
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Re: arreglo de objetos(imagenes) para subir a un servidor

Lo que podrias hacer es copiarlas a una carpeta temporal que tu tengas el control y las guardas con un nombre especifico, posteriormente ya que hagas la insercion las copias desde alla, y en caso de que canceles, levantas un cronjob que lo que haga sea borrar periodicamente las imagenes "basura" que se queden en tu carpeta temporal.

Saludos.
  #7 (permalink)  
Antiguo 08/01/2008, 19:27
Avatar de lacho  
Fecha de Ingreso: enero-2008
Mensajes: 26
Antigüedad: 16 años, 3 meses
Puntos: 0
Re: arreglo de objetos(imagenes) para subir a un servidor

ya buena idea solo que como decia soy novato y el cronjob, bueno por allli se que hay algo llamado crontab en linux y te permite hacer tareas periodicas mediante scripts, igual no se como se hace pero no se imagino que es algo por el estilo lo que dices, pero en ese caso como puedo hacer mi cronjob?

y gracias de antemano

Última edición por lacho; 08/01/2008 a las 19:35
  #8 (permalink)  
Antiguo 08/01/2008, 21:29
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Re: arreglo de objetos(imagenes) para subir a un servidor

Un cronjob no es nadamas un Script PHP que se ejecuta con cierta periodicidad que tu le indiques, asi que tu solo programa el script que necesites y solo usa la interfaz para decirle que se ejecute por ejemplo cada 10 horas, etc.

Saludos.
  #9 (permalink)  
Antiguo 09/01/2008, 18:06
Avatar de lacho  
Fecha de Ingreso: enero-2008
Mensajes: 26
Antigüedad: 16 años, 3 meses
Puntos: 0
Re: arreglo de objetos(imagenes) para subir a un servidor

ok, gracias por todo, voy a probar hacer todo eso, y pues si me funciona lo posteo para que quede de documentacion.
  #10 (permalink)  
Antiguo 11/01/2008, 15:14
Avatar de lacho  
Fecha de Ingreso: enero-2008
Mensajes: 26
Antigüedad: 16 años, 3 meses
Puntos: 0
Re: arreglo de objetos(imagenes) para subir a un servidor

hola de nuevo foro, segui trabajando un poco en la idea que ya tenia, y pues he logrado que funcione a medias quiza, pues bien lo que me decian exactamente pasa, si cierro el popup se pierde la informacion, pero pues por alli momentaneamente obligare al usuario a que la mantenga abierta mientras guarda el articulo y pues he quedado con esto(pongo los scripts en el orden en que se ejecutan):

script loadimg.php: este script es que que recibe el formulario con las imagenes que quiero enviar,la ventana que contiente este no se debe cerrar para poder tener los datos de la sesion:

Código PHP:
include("archivo.inc.php");

   
//Preguntamos si nuetro arreglo 'archivos' fue definido
 
if (isset ($_FILES["archivos"])) {
      
    
    foreach (
$_FILES['archivos'] as $k => $l
    {
        foreach (
$l as $i => $v) {
            if (!
array_key_exists($i$_SESSION['img'])) 
                
$_SESSION['img'][$i] = array();
            
$_SESSION['img'][$i][$k] = $v;
            
$_SESSION['img'][$i]['comentario']=$_POST['descripcion'][$i];
            
            }
    }
    
   
        
  }   
?> 
sin cerrar el popup anterior nos vamos a tengo los campos para guardar el articulo en si, como la primera imagen del primer post, ya que tenemos toda la informacion en los campos damos guardar y entonces debe invocar al siguiente script:

Código PHP:
include("seguridad.php");
include(
"clase_articulo.php");


session_start();

$codart=articulo::generarcodigo();
$art=new articulo($codart,$_POST['tituloart'],$_POST['subtema'],$_SESSION['usuario_actual']['usuario'],$_POST['fecha'],$_POST['contenido'],$_POST['estado']);
$resultado=$art->guardar();


$tipo="articulo";

$art->subirimagenes($art->cargarimagenes($_SESSION['img']));
if (!
$resultado)
{
header("Location: http://localhost/error.php?msj=".$tipo);
}
else 
{
header("Location: http://localhost/exito.php?msj=".$tipo);} 
las clases las pongo aqui, bueno solo los metodos que se usan en el script anterior:

Código PHP:
<?

class Archivo {
    var 
$Nombre;
    var 
$Comentario;
    var 
$Tipo;
    var 
$Temporal;
    var 
$Ruta;
    var 
$tamanio;
    
    
    function 
Archivo($archivoEnviado) {
        
$this->Nombre=$archivoEnviado['name'];
        
$this->Comentario=$archivoEnviado['comentario'];
        
$this->Tipo=$archivoEnviado['type'];
        
$this->Temporal=$archivoEnviado['tmp_name'];        
        
$this->tamanio=$archivoEnviado['size'];
    }
    
    
    
    public function 
darcomentario()
    {
        return 
$this->Comentario;
    }
    
    public function 
dartipo()
    {
        return 
$this->Tipo;
    }
    
    public function 
dartamanio()
    {
        return 
$this->tamanio;
    }
    
        
    public function 
darnombre()
    {
        return 
$this->Nombre;
    }
    
    function 
esValido() {
        
        if (
strpos($this->Tipo,"jpeg") || strpos($this->Tipo,"png") || strpos($this->Tipo,"gif") || strpos($this->Tipo,"bmp"))
            return 
true;
        else 
            return 
false;
    }
    
    function 
Subir($ruta) {
        
$this->Ruta=$ruta;
        
        if (
move_uploaded_file($this->Temporal,$this->Ruta."/".$this->Nombre))
            return 
true;
        else
            return 
false;
    }
    
    function 
Borrar() {
        if (@
unlink($this->Ruta."/".$this->Nombre))
            return 
true;
        else
            return 
false;
    }
}

?>
ahora donde uso esta clase en si para hacerme segun yo mi arreglo de imagenes y subirlas a mi servidor por medio de la clase articulo:

Código PHP:
include("conexion.php");
include(
"archivo.inc.php");


class 
articulo
{
    
    private 
$submenu;    
    private 
$autor;
    private 
$fecha;
    private 
$contenido;
    private 
$imagenes;
    private 
$estado;
    private 
$codArticulo;
    private 
$tituloArt;
    

    
    public function 
__construct($codArticulo,$tituloArt,$submenu,$autor,$fecha,$contendio,$estado)
    {
        
$this->codArticulo=$codArticulo;
        
$this->submenu=$submenu;
        
$this->autor=$autor;
        
$this->fecha=$fecha;
        
$this->contenido=$contendio;
        
$this->estado=$estado;
        
$this->tituloArt=$tituloArt;
        
$this->imagenes=array();
    }
    

    public function 
cargarimagenes($arreglo)
    {
            
               foreach (
$arreglo as $file
               {    
                
$this->imagenes[]=new Archivo($file);
                       }
           return 
$this->imagenes;
    }
    
    public function 
subirimagenes($arrimagenes)
    {
        
        
$ruta="art_imagenes";
        foreach (
$arrimagenes as $imagen) {
            
$imagen->Subir($ruta);
            
$dir=$ruta."/".$imagen->darnombre();
            
Conectarse();    
            
$sql="insert into imagen(rutaimagen,descripcion,fecha,codArt) values('$dir','".$imagen->darcomentario()."','$this->fecha','$this->codArticulo')";
            
$resultado=mysql_query($sql);
            
        }
             
            return 
$resultado;
            
              }


ahora la pregunta o lo que no me funciona bien es el metodo subir de la clase archivo ya que si llama al metodo pero no ejecuta move_uploaded_file, alguien me podria dar una ayudadita para saber que esta mal y poder subir la imagen????, ya que lo demas funciona bien, claro teniendo en cuenta que la ventana del popup no se cierra mientras se guarda el articulo.

gracias de antemano.

Nota: se que me recomendaban subirlo las imagenes temporalmente, pero la cuestion es que igual tengo que insertar en la base de datos donde esta la imagen. Y tambien lo tengo alli en proyecto paralelo de hacerlo de la otra manera.
  #11 (permalink)  
Antiguo 11/01/2008, 16:03
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Re: arreglo de objetos(imagenes) para subir a un servidor

Lo unico que se me ocurre es que tu clase imagen no encuentre la imagen, en cuyo caso puedes agregar este codigo:
Código PHP:
function Subir($ruta) {
        
$this->Ruta=$ruta;

        if( !
file_exists$this->Temporal ) ) {
                  
trigger_error"No existe el archivo temporal: " $this->Temporal );
        }

        if( !
file_exists$this->Ruta "/" ) ) {
                  
trigger_error"La ruta para subir el archivo es incorrecta: " $this->Ruta );
        }
        
        if (
move_uploaded_file($this->Temporal,$this->Ruta."/".$this->Nombre))
            return 
true;
        else
            return 
false;
    } 
Saludos.
  #12 (permalink)  
Antiguo 11/01/2008, 16:10
Avatar de lacho  
Fecha de Ingreso: enero-2008
Mensajes: 26
Antigüedad: 16 años, 3 meses
Puntos: 0
Re: arreglo de objetos(imagenes) para subir a un servidor

Notice: No existe el archivo temporal: C:\Windows\TEMP\php2213.tmp in C:\AppServ\www\archivo.inc.php on line 65

es la salida, entonces en donde se perdio en el camino??? eske yo asumia que en el arreglo que genero de instancias de archivo esta como tal cada mienmbro osea cada imagen de las que traia el arreglo de $_FILES...
  #13 (permalink)  
Antiguo 11/01/2008, 16:51
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Re: arreglo de objetos(imagenes) para subir a un servidor

Pasa lo que te comentaba los archivos temporales están bloqueados al script que "recibe" el archivo, y no lo puedes compartir sin antes haberlos copiado a un medio donde tu tengas el control.

Edito:
Ahora que lo pienso, el garbage collector esta borrando los archivos a la hora de iniciar tu script al parecer PHP esta programado para correr el garbage collector al inicio y al final de tu script, y esta causando ese problema.

Saludos.
  #14 (permalink)  
Antiguo 11/01/2008, 16:56
Avatar de lacho  
Fecha de Ingreso: enero-2008
Mensajes: 26
Antigüedad: 16 años, 3 meses
Puntos: 0
Re: arreglo de objetos(imagenes) para subir a un servidor

esque en teoria yo si doy un print_r o un var_dump al miembro de la clase archivo, y esta con la informacion, y el archivo deberia estar alli porque la ventana nunca se cerro.
  #15 (permalink)  
Antiguo 11/01/2008, 19:08
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Re: arreglo de objetos(imagenes) para subir a un servidor

Si, pero lo que tu tienes en tu clase archivo es un string, una cadena de texto que indica que es un archivo pero eso no te garantiza que el archivo exista todavia, y esque aunque no cierres la ventana tu script termina al procesar el upload.

Saludos.
  #16 (permalink)  
Antiguo 11/01/2008, 21:01
Avatar de lacho  
Fecha de Ingreso: enero-2008
Mensajes: 26
Antigüedad: 16 años, 3 meses
Puntos: 0
Re: arreglo de objetos(imagenes) para subir a un servidor

hola de nuevo! jaja ya los tengo chinos! de tanto post, pero bueno pues segui la sugerencia y pues esto lo agrege al script que recibe las imagenes, bueno entonces lo subi a este directorio temporal, esto funciona perfectamente.
Código PHP:
   foreach ($_SESSION['img'] as $file) {
    
          
$i=1;
        
$imagen = new Archivo($file);
        if (
file_exists("Temp")) 
        {
              
$imagen->Subir("Temp");
              
chmod ("Temp/".$imagen->darnombre(),0777);
        } 
        else 
        {
              
mkdir("Temp",0777);
              
$imagen->Subir("Temp");
              
chmod ("Temp/".$imagen->darnombre(),0777);
        } 
luego al guardar el articulo, por alli esta ese codigo mas arriba pero modifique un poquito uno de los metodos de la clase articulo para no hacer cronjob, ya que por el momento desarrollo en window$ y es posible que el sitio se monte en linux, pero eso todavia no lo se, pues bien entonces mejor decidi borrar los archivos despues de copiarlos a la carpeta donde los quiero de verdad y despues solucioanare el detalle de que si carga las imagenes pero no guarda el articulo, alli es donde debe entrar en cronjob pero bueno la cosa que lei sobre eso y ahora creo ke ya tengo una idea de como hacerlo pero bueno ese no es el punto, la cuestion es que no me copia los ficheros y no se porque no lo hace ya que no da ningun tipo de mensaje, este es el codigo:

Código PHP:
public function subirimagenes($arrimagenes)
    {
        
        
$ruta="art_imagenes";
        foreach (
$arrimagenes as $imagen) {
            
            
$dir=$ruta."/".$imagen->darnombre();
            
$imagen->copiar("Temp",$ruta,$imagen->darnombre());
            
$imagen->borrar("Temp",$imagen->darnombre());
            
Conectarse();    
            
$sql="insert into imagen(rutaimagen,descripcion,fecha,codArt) values('$dir','".$imagen->darcomentario()."','$this->fecha','$this->codArticulo')";
            
$resultado=mysql_query($sql);
            
        }
            
            return 
$resultado;
    } 
y aqui estan los metodos que se usan de la clase archivo:

Código PHP:
function copiar($origen,$destino,$nombre)
    {
        if (!
file_exists($origen."/".$nombre))
        {
            
copy($origen."/".$nombre,$destino."/".$nombre);    
            return 
true;
        }
        else 
        return 
false;
    }

function 
borrar($directorio,$nombre) {
        if (@
unlink($directorio."/".$nombre))
            return 
true;
        else
            return 
false;
    } 
no se que es lo que esta mal, pero no me copia las imagenes de la carpeta Temp, y pues pongo lo de los permisos porque inicialmente me decia que no tenia permisos para acceder a los archivos de Temp y porque como les decia es probable que se aloje en un servidor con linux. ¿porque no me copia las imagenes?
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:37.