Foros del Web » Programando para Internet » PHP »

script para calcular tamaño de las fotos al subirlas

Estas en el tema de script para calcular tamaño de las fotos al subirlas en el foro de PHP en Foros del Web. Estoy busando un script para mi página web. Es una red social: http://www.doyouvegit.com que permite ente otras cosas subir fotos por los usuarios. El tema ...
  #1 (permalink)  
Antiguo 21/12/2008, 18:03
Avatar de mrsorpresa  
Fecha de Ingreso: enero-2008
Mensajes: 323
Antigüedad: 16 años, 3 meses
Puntos: 6
script para calcular tamaño de las fotos al subirlas

Estoy busando un script para mi página web. Es una red social: http://www.doyouvegit.com que permite ente otras cosas subir fotos por los usuarios.

El tema está en que si la foto es mayor de 2000 px por alguna de sus dimensiones (alto o ancho), se produce un error y sale el siguiente mensaje en la propia página:

Código HTML:
Fatal error: Out of memory (allocated 33292288) (tried to allocate 13056 bytes) in /homepages/41/d222577377/htdocs/vegit/include/class_upload.php on line 178
Lo que quiero es un script que calcule las dimensiones de la foto, y en caso de que sea mayor de estas dimensiones, redirija a una página de error, o bien salga una ventana de aviso diciendo al usuario que debe reducir las fotos de tamaño.

Este es el código que se encarga de la subida:

Código PHP:
// UPLOAD FILES
if($task == "doupload") {
  
$file_result = Array();

  
// RUN FILE UPLOAD FUNCTION FOR EACH SUBMITTED FILE
  
$update_album 0;
  
$new_album_cover "";
  for(
$f=1;$f<6;$f++) {
    
$fileid "file".$f;
    if(
$_FILES[$fileid]['name'] != "") {
      
$file_result[$fileid] = $album->album_media_upload($fileid$album_id$space_left);
      if(
$file_result[$fileid]['is_error'] == 0) {
      
$file_result[$fileid]['message'] = stripslashes($_FILES[$fileid]['name'])." $user_album_upload[1]";
    
$new_album_cover $file_result[$fileid]['media_id'];
        
$update_album 1;
      }
    }
  } 
EDITO: se me olvidaba poner el código del class_upload.php que se encarga de calcular el tamaño de las fotos:

Código PHP:
  // CHECK IF DIMENSIONS ARE LARGER THAN ADMIN SPECIFIED SETTINGS
      // AND SET DESIRED WIDTH AND HEIGHT
      
if($this->file_width $file_maxwidth $this->file_height $file_maxheight) { 
        if(
$this->file_height $file_maxheight) {
          
$width = ($this->file_width)*$file_maxheight/($this->file_height);
          
$height $file_maxheight;
        }
        if(
$this->file_width $file_maxwidth) {
          
$height = ($this->file_height)*$file_maxwidth/($this->file_width);
          
$width $file_maxwidth;
        }
      } else {
        
$width $this->file_width;
        
$height $this->file_height;
      } 
Este script símplemente sube las fotos si cumplen el tamaño especificado, y en caso contrario da el error que comentaba antes.

Muchas gracias

Última edición por mrsorpresa; 21/12/2008 a las 18:19
  #2 (permalink)  
Antiguo 22/12/2008, 04:51
Avatar de david_f  
Fecha de Ingreso: mayo-2007
Ubicación: Santiago De Los Caballeros, Santiago, Dominican Republic, Dominican Republic
Mensajes: 52
Antigüedad: 16 años, 11 meses
Puntos: 3
Respuesta: script para calcular tamaño de las fotos al subirlas

Este error:

Código:
Fatal error: Out of memory (allocated 33292288) (tried to allocate 13056 bytes) in /homepages/41/d222577377/htdocs/vegit/include/class_upload.php on line 178
NO se trata de que la imagen sea o no mayor de 2mil px, ese error es porque cargas el intérprete de tal forma que los 32MB que están especificados en el php.ini y que son reservados para ejecutar un script en PHP, se vuelcan por X o Y razón. ¿Intentaste subir una imagen totalmente en blanco de 2mil px? Inténtalo y te aseguro que eso no pasará.

En fin... para obtener el "tamaño" de una imagen debes utilizar la función getimagesize(), pero la misma no te funcionará si no puede acceder al archivo, es decir que de todas formas debe "subirse" el archivo para luego obtener la información.

Te recomiendo lo siguiente:

Si estás usando un dedicado, abres el php.ini, busques donde dice: "memory_limit" y lo cambies a, no sé... 128 MB o 256 MB o lo que quieras. Si no tienes acceso al php.ini, coloca en el principio del archivo que sube la imagen esto:

Código PHP:
ini_set('memory_limit''128M'); 
Luego que logres subir el archivo temporal, utiliza getimagesize() para obtener las DIMENSIONES de la imagen.

Suerte.
  #3 (permalink)  
Antiguo 22/12/2008, 06:16
Avatar de mrsorpresa  
Fecha de Ingreso: enero-2008
Mensajes: 323
Antigüedad: 16 años, 3 meses
Puntos: 6
Muchas gracias por la ayuda, pero no entiendo algunas cosas, a saber:

Cita:
los 32MB que están especificados en el php.ini y que son reservados para ejecutar un script en PHP
¿Quieres decir que cada script php tiene una reserva de memoria de 32 mb especificado en el php.ini?

La verdad es que de este tema sé bien poco. Mis conocimiento de php son casi nulos. Lo que sí te digo es que tengo la página en un servidor compartido. No sé si los del hosting me van a permitir modificar eso...

Bueno, ya he hablado con mi servidor de hosting, y me han dicho que puedo perfectamente crear ese archivo php.ini he incluirlo yo mismo.

Como comentaba antes, conozco my poco de estos temas. Voy a necesitar que me expliques un poco más cómo hacerlo. No he encontrado ningún archivo php.ini.

Cita:
Si no tienes acceso al php.ini, coloca en el principio del archivo que sube la imagen esto:
El archivo que sube la imagen es este?

Cita:
// UPLOAD FILES
if($task == "doupload") {
$file_result = Array();

// RUN FILE UPLOAD FUNCTION FOR EACH SUBMITTED FILE
$update_album = 0;
$new_album_cover = "";
for($f=1;$f<6;$f++) {
$fileid = "file".$f;
if($_FILES[$fileid]['name'] != "") {
$file_result[$fileid] = $album->album_media_upload($fileid, $album_id, $space_left);
if($file_result[$fileid]['is_error'] == 0) {
$file_result[$fileid]['message'] = stripslashes($_FILES[$fileid]['name'])." $user_album_upload[1]";
$new_album_cover = $file_result[$fileid]['media_id'];
$update_album = 1;
}
}
}
O este otro?
Cita:
// CHECK IF DIMENSIONS ARE LARGER THAN ADMIN SPECIFIED SETTINGS
// AND SET DESIRED WIDTH AND HEIGHT
if($this->file_width > $file_maxwidth | $this->file_height > $file_maxheight) {
if($this->file_height > $file_maxheight) {
$width = ($this->file_width)*$file_maxheight/($this->file_height);
$height = $file_maxheight;
}
if($this->file_width > $file_maxwidth) {
$height = ($this->file_height)*$file_maxwidth/($this->file_width);
$width = $file_maxwidth;
}
} else {
$width = $this->file_width;
$height = $this->file_height;
}
Cuando dices que ponga al principio esto: ini_set('memory_limit', '128M'); quieres decir que lo ponga al principio del documento, no?

Tampoco sé dónde debería ubicar el getimagesize()...

Muchas gracias.

Última edición por GatorV; 22/12/2008 a las 12:39
  #4 (permalink)  
Antiguo 22/12/2008, 09:56
Avatar de david_f  
Fecha de Ingreso: mayo-2007
Ubicación: Santiago De Los Caballeros, Santiago, Dominican Republic, Dominican Republic
Mensajes: 52
Antigüedad: 16 años, 11 meses
Puntos: 3
Respuesta: script para calcular tamaño de las fotos al subirlas

Ok.... vamos a ver cómo respondo las varias preguntas

Primero... memory_limit es un limite de memoria que, para decirlo simple, PHP puede usar de la memoria del sistema para lograr ejecutar un script. Normalmente es 8, 16 y 32 MB, ya que, al menos que tengas muchos bucles largos anidados, no es necesario usar tanta memoria. En tu caso, realmente no entiendo por qué está consumiendo tanta memoria.

Si tu proveedor de hosting te permite utilizar tu propio php.ini solo debes crear un archivo con el siguiente contenido y subirlo a tu directorio raiz:

Código:
;;;;;;;;;;;;;;;;;;;
; Resource Limits ;
;;;;;;;;;;;;;;;;;;;

max_execution_time = 180     ; Maximum execution time of each script, in seconds
max_input_time = 120	; Maximum amount of time each script may spend parsing request data
memory_limit = 128M      ; Maximum amount of memory a script may consume (128MB)
Con eso debes arreglar el Fatal Error.

Segundo. Entonces tu codigo seria asi:
Código PHP:
// UPLOAD FILES
if($task == "doupload") {
$file_result = Array();

// RUN FILE UPLOAD FUNCTION FOR EACH SUBMITTED FILE
$update_album 0;
$new_album_cover "";
for(
$f=1;$f<6;$f++) {
    
$fileid "file".$f;
    if(
$_FILES[$fileid]['name'] != "") {
        if(
is_file($_FILES[$fileid]['tmp_name'])){
            
$dimensiones getimagesize($_FILES[$fileid]['tmp_name']);
            if( (int) 
$dimensiones[0] < 2000){
                
$file_result[$fileid] = $album->album_media_upload($fileid$album_id$space_left);
                if(
$file_result[$fileid]['is_error'] == 0) {
                    
$file_result[$fileid]['message'] = stripslashes($_FILES[$fileid]['name'])." $user_album_upload[1]";
                    
$new_album_cover $file_result[$fileid]['media_id'];
                    
$update_album 1;
                }
            }
            else 
                exit(
"El ancho de la imagen no puede ser mayor de 2,000 px.");
        }
    }

Creo que con eso resuelves. Cualquier cosa me avisas
  #5 (permalink)  
Antiguo 22/12/2008, 13:28
Avatar de mrsorpresa  
Fecha de Ingreso: enero-2008
Mensajes: 323
Antigüedad: 16 años, 3 meses
Puntos: 6
Respuesta: script para calcular tamaño de las fotos al subirlas

Respecto al script, parece que funciona. Lo he probado con archivos levemente más grandes de lo permitido, y efectivamente me sale el mensaje indicando que hay que reducir la imagen.

Pero...

No he podido meter el archivo en el php.ini de mi host. La razón: sólo tengo acceso a la carpeta http, no al directorio raiz (mi servicio de host me impone esa limitación). Si la imagen ya sobrepasa los (aproximadamente) 2.5 megas, la foto no sube. O bien sale el mensaje de error mencionado antes, o bien directamente no se sube nada y se queda la página como está.

Necesito otra manera de aumentar ese límite de memoria. No sé si estoy pidiendo un imposible
  #6 (permalink)  
Antiguo 22/12/2008, 14:04
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: script para calcular tamaño de las fotos al subirlas

En servidores compartidos (los mas comunes) no es posible modificar la configuracion de PHP (o de Apache), para eso necesitarias un Servidor Virtual Privado (VPS) o uno dedicado, ambos de costo mucho mas elevado que un hosting compartido.
__________________
- León, Guanajuato
- GV-Foto
  #7 (permalink)  
Antiguo 22/12/2008, 14:46
Avatar de mrsorpresa  
Fecha de Ingreso: enero-2008
Mensajes: 323
Antigüedad: 16 años, 3 meses
Puntos: 6
Respuesta: script para calcular tamaño de las fotos al subirlas

Cita:
Iniciado por Triby Ver Mensaje
En servidores compartidos (los mas comunes) no es posible modificar la configuracion de PHP (o de Apache), para eso necesitarias un Servidor Virtual Privado (VPS) o uno dedicado, ambos de costo mucho mas elevado que un hosting compartido.
Pues entonces necesito otra solución.

David_f comentaba esto:
Cita:
Si no tienes acceso al php.ini, coloca en el principio del archivo que sube la imagen esto:

Código PHP:
ini_set('memory_limit''128M'); 
Luego que logres subir el archivo temporal, utiliza getimagesize() para obtener las DIMENSIONES de la imagen.

Suerte.
No lo he probado todavía porque no sé muy bien como usar getimagesize()

Podemos empezar por ahí. Y si no, estoy abierto a otras soluciones.
  #8 (permalink)  
Antiguo 22/12/2008, 16:58
Avatar de david_f  
Fecha de Ingreso: mayo-2007
Ubicación: Santiago De Los Caballeros, Santiago, Dominican Republic, Dominican Republic
Mensajes: 52
Antigüedad: 16 años, 11 meses
Puntos: 3
Respuesta: script para calcular tamaño de las fotos al subirlas

A "directorio raiz" me referefia a tu "httpdocs", al directorio donde tienes tu "index.php". solo subes un archivo "php.ini" con las configuraciones que te dije.

Si esto no te funciona, pon: "ini_set('memory_limit', '128M'); " al inicio del archivo donde están las otras modificaciones , es decir, el archivo .php donde está el código : "// UPLOAD FILES"
  #9 (permalink)  
Antiguo 22/12/2008, 18:13
Avatar de mrsorpresa  
Fecha de Ingreso: enero-2008
Mensajes: 323
Antigüedad: 16 años, 3 meses
Puntos: 6
Respuesta: script para calcular tamaño de las fotos al subirlas

Muchas gracias, pero me parece que esta limitación de memoria es un mal endémico con los de 1&1. Por lo que he consultado, no aumentan el límite de memoria php en un hosting compartido. Así que me parece que no va a servir nada de lo que haga. No obstante lo voy a probar otra vez, pero ya mañana, y luego os cuento cómo me fue.

Un saludo
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.
Tema Cerrado

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 19:49.