• Publicidad

¿Cómo generar una imagen con Perl?

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Re: ¿Cómo generar una imagen con Perl?

Notapor explorer » 2006-03-13 12:22 @557

El primer error se te va si consigues utilizar una alternativa al system.
Y el segundo error se te va si escribes la imagen en un directorio en el que tengas permiso de escritura Y sea accesible por el usuario que corre el web. Eso es justo lo que te está diciendo el error: que has generado la imagen en el propio directorio cgi-bin, y ese directorio sólo sirve para guardar programas.

Un ejemplo.
Si el web lo tienes colgando de /var/www/misitioweb/ entonces creas el subdirectorio tmp dentro de ese camino.
Le das permiso al directorio tmp para que sea escribible por el usuario que corre el servidor web y por el usuario propietario de los ficheros (puede ser el mismo): chown slopal.www-data tmp; chmod 775 tmp;.
En el programa, el proceso que puedes hacer es:

1.- Entra en el directorio tmp/: chdir /var/www/misitioweb/tmp;
2.- Haces un listado con todas las imágenes disponibles: my @imagenes = <imagen*.gif>;
3.- Haces un bucle por todas ellas y te cargas todas las viejas:
foreach my $imagen ( @imagenes ) {
unlink $imagen if -M $imagen > 3; # Borrar en caso de tener más de 3 días
}

4.- En función de los parámetros pasados por el usuario, calculas el nombre de la nueva imagen a crear. Se supone entonces que aquí hay un truco: si un usuario llama a tu programa con los mismos parámetros, debería siempre ver la misma imagen. Si ese no es tu caso, entonces el paso siguiente lo saltas.
my $imagen = ... ;
5.- En caso de que esa imagen ya exista ( -e $imagen ) saltamos la generación de la imagen
6.- Generamos la imagen y la guardamos (ya estamos dentro de tmp/, por lo que la guardamos en el directorio actual)
my $img = new GD; ...
7.- Generamos la página html. Las referencias a la imagen serán: <img src="/tmp/imagenDGHFDSJ343JHH23.gif>
8.- Entregamos la página html al usuario. ( $|=1; print ... )

Lo ideal sería hacer el borrado de las imágenes viejas después de la entrega de la página, en caso de ser muchas, pero este es un trabajo que los ordenadores hacen de forma muy rápida y el usuario ni se enteraría.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Publicidad

Notapor slopal » 2006-03-15 12:26 @560

gracias :) si no encuentro alternativa al system (con exec me pasa lo mismo y tampoco creo q sea lo q necesito) lo hare mediante un fichero temporal de texto y andando.

ademas el tema d las imagenes -por ahora- no me interesa ver las que se han guardado anteriormente, la imagen q genero pesa muy poco (< 1 KB) y seran muy aleatorias.
slopal
Perlero nuevo
Perlero nuevo
 
Mensajes: 78
Registrado: 2005-11-23 11:41 @528

Notapor slopal » 2006-03-27 11:29 @520

explorer escribiste:Si el web lo tienes colgando de /var/www/misitioweb/ entonces creas el subdirectorio tmp dentro de ese camino.
Le das permiso al directorio tmp para que sea escribible por el usuario que corre el servidor web y por el usuario propietario de los ficheros (puede ser el mismo): chown slopal.www-data tmp; chmod 775 tmp;


Como puedo saber cual es cual? mi web cuelga de:
gralggen/public_html/recerca/freq

y si hago un ls-la obtengo:

-rw-r--r-- 1 gralggen it 394 Feb 28 20:31 example1.html

entonces el usuario es gralggen?
es que yo creo un directorio que se llama /images con los mismos atributos que lo anterior. Y desde el CGI que se ejecuta en
/gralggen/cgi-bin/freq
(con los ficheros de dentro con los mismos atributos que anteriormente (gralggen it))
no me deja crear ficheros dentro de /images :( y por lo tanto no puedo probar...

(si en cambio, pongo la imagen "a mano" en ese directorio, si que puedo mostrarlo via web... por lo que supongo q el usuario que corre en el servidor sera este.. pero no estoy segura.. pq no me deja copiaar :()
slopal
Perlero nuevo
Perlero nuevo
 
Mensajes: 78
Registrado: 2005-11-23 11:41 @528

Re: ¿Cómo generar una imagen con Perl?

Notapor explorer » 2006-03-27 13:26 @601

slopal escribiste:
explorer escribiste:Si el web lo tienes colgando de /var/www/misitioweb/ entonces creas el subdirectorio tmp dentro de ese camino.
Le das permiso al directorio tmp para que sea escribible por el usuario que corre el servidor web y por el usuario propietario de los ficheros (puede ser el mismo): chown slopal.www-data tmp; chmod 775 tmp;


Como puedo saber cual es cual? mi web cuelga de:
gralggen/public_html/recerca/freq

y si hago un ls-la obtengo:

-rw-r--r-- 1 gralggen it 394 Feb 28 20:31 example1.html

entonces el usuario es gralggen?

Ese es el usuario de ese fichero, pero quizás no lo sea del directorio donde está ('.'). Haz un ls -la y fíjate en el propietario del directorio actual. Haz un ps aux para saber el nombre del usuario bajo el que corre el servidor web. Puede ser www, www-data, web, httpd, apache, etc. etc. El directorio images deberá pertenecer a ti (usuario web gralggen) y al mismo grupo al que pertenece el usuario web. Algo así como chown gralggen.www-data images. Y luego los permisos de escritura para los dos y sólo ellos dos: chmod 775 images. Hay que dar permiso de entrada y lectura al resto del mundo para que puedan ver las imágenes :)
slopal escribiste:es que yo creo un directorio que se llama /images con los mismos atributos que lo anterior. Y desde el CGI que se ejecuta en /gralggen/cgi-bin/freq (con los ficheros de dentro con los mismos atributos que anteriormente (gralggen it)) no me deja crear ficheros dentro de /images :( y por lo tanto no puedo probar...)

Para escribir en el directorio images, recuerda que el script debe conocer el camino COMPLETO a ese directorio, en el árbol de directorios del disco, no del web. Por ejemplo, open my $fh, '>', '/home/gralggen/public_html/recerca/freq/images/imagen.png' or die "ERROR al escribir imagen.png: $!\n";
slopal escribiste:(si en cambio, pongo la imagen "a mano" en ese directorio, si que puedo mostrarlo via web... por lo que supongo q el usuario que corre en el servidor sera este.. pero no estoy segura.. pq no me deja copiaar :()
Tendrás que preguntar al administrador si no estás segura del usuario web. Cuando digo usuario web es el usuario bajo el que se ejecutan los cgis.
Puede ser que todo el problema sea cosa de permisos de los directorios.
Puedes tirar por la calle del medio y darle permisos de escritura a todo el mundo a images: chmod 777 images y probar a ver si puedes escribir algo. Si falla, es que el script no puede encontrar ese directorio. Fíjate en el código de error que sale en el die que está contenido en la variable especial $!.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor slopal » 2006-03-28 11:13 @509

despues de darle 200 vueltas y pruebas diferentes y poner chivatos he descubierto que:

- sí que puedo crear ficheros ahi (oleee)
- sí que puedo crear imágenes bien hechas ahí (oleee)

- explediente X: no puedo crear la imagen de esta manera concreta:

Código: Seleccionar todo
open(IM, ">/homes/users55/users/gralggen/public_html/recerca/freq/images/imatge_$tmp.png") ;


cual es el problema? la variable $temp que no me la coge (o algo asi). Esta variable es de la forma 724.480816469626 recogida por GET desde otro CGI.

Cualquier otra variable funciona, incluso poniendolo a "mano" (grafic_724.480816469626.png) funciona.


He probado a cambiar el nombre de la variable: NADA. He probado a copiar la variable en otra: NADA.

Es más! esta misma variable la utilizo para abrir un fichero (previamente)!! del mismo estilo:


Código: Seleccionar todo
open(TEMP, "<$dir/temp_$tmp.txt") or die('error');
binmode(TEMP);

y me abre perfectamente el fichero...

cuando llega a la linea de abrir la imagen (justo una linea antes, hago un print de la variable en un fichero temporal) Y SIGUE ESTANDO BIEN EL CONTENIDO.

He probado las mismas lineas desde el cgi previo (desde donde le envio por GET la variable) y me funciona perfectamente.

Y nose, he hecho 200mil pruebas mas... (que si me vienen a la cabeza las pongo) y no lo entiendo... solo me pueden pasar a mí estas cosas raras :(.


* He llegado a pensar que no lo entienda como un string y por eso no lo sepa hacer (pero entonces pq me funciona el open del temp?). De todas maneras... hay alguna funcion o algo asi para forzar que una variable sea del tipo string? (sprintf? :S)

Alguna IDEA?
slopal
Perlero nuevo
Perlero nuevo
 
Mensajes: 78
Registrado: 2005-11-23 11:41 @528

Notapor slopal » 2006-03-28 11:28 @519

parece que lo del sprintf puede funcionar... si encuentro el valor de %___ adecuado (veo que teneis un manual!!) :)

el numerito en cuestion es el resultado de hacer un rand(1000) a lo mejor tendría que "cortarle" decimales... pq no encuentro una funcion que me vaya bien... nose :S o hacer un rand de un numero muchiiiisimo mas grande y hacer un int(....) voy a probar :)

----> utlima hora:P: con el int(rand(....)) lo he solucionado haciendo un sprintf %d antes de hacer el open de la imagen...

Vale, solucionado, pero sigo sin entender pq me ha dejado hacer el open del temp y no el de la imagen :?: ALGUNA IDEA? GRACIAS
slopal
Perlero nuevo
Perlero nuevo
 
Mensajes: 78
Registrado: 2005-11-23 11:41 @528

Re: ¿Cómo generar una imagen con Perl?

Notapor explorer » 2006-03-28 12:49 @576

slopal escribiste:
Código: Seleccionar todo
open(IM, ">/homes/users55/users/gralggen/public_html/recerca/freq/images/imatge_$tmp.png") ;
cual es el problema? la variable $temp que no me la coge (o algo asi). Esta variable es de la forma 724.480816469626 recogida por GET desde otro CGI.
cuando llega a la linea de abrir la imagen (justo una linea antes, hago un print de la variable en un fichero temporal) Y SIGUE ESTANDO BIEN EL CONTENIDO.
Alguna IDEA?
Haz esto y nos dices lo que sale:
Código: Seleccionar todo
$imagen = "/homes/users55/users/gralggen/public_html/recerca/freq/images/imatge_$tmp.png";
open(IM,">$imagen") or die "ERROR: No puedo crear la imagen $imagen: $!\n";
Es importante usar la variable especial $! para saber lo que ha sucedido.
Última edición por explorer el 2006-03-28 13:04 @586, editado 1 vez en total
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: ¿Cómo generar una imagen con Perl?

Notapor explorer » 2006-03-28 12:59 @582

slopal escribiste:----> utlima hora:P: con el int(rand(....)) lo he solucionado haciendo un sprintf %d antes de hacer el open de la imagen...
Otra forma de generar secuencias aleatorias:
Código: Seleccionar todo
my @semilla = ( 'A' .. 'Z', 0 .. 9 );
my $dir = join('', map { $semilla[ rand(@semilla) ] } (1..10));

Lo que hacemos es primero crear un array (@semilla) que contiene un elemento por cada letra de la A a la Z más los diez dígitos.
Luego, hacemos un bucle (map) del 1 al 10 y por cada uno de ellos sacamos un número aleatorio (rand) entre 0 y $#semilla (esto es, el número de elementos del array, menos uno).
Este número lo usaremos como índice ([]) dentro del propio array para sacar una letra cada vez.
Finalmente, todas las letras que estamos sacando de forma aleatoria, las unimos (join) y lo metemos todo en la variable $dir.
Sale algo como esto: AD3GZH720E
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor slopal » 2006-04-03 11:53 @537

explorer escribiste:Haz esto y nos dices lo que sale:
Código: Seleccionar todo
$imagen = "/homes/users55/users/gralggen/public_html/recerca/freq/images/imatge_$tmp.png";
open(IM,">$imagen") or die "ERROR: No puedo crear la imagen $imagen: $!\n";
Es importante usar la variable especial $! para saber lo que ha sucedido.


Pues no sé lo que sale pq es un script llamado desde otro script d forma img src= ....script.pl ...
y si da error, directamente, la imagen no se muestra :S

pero weno.. ya he conseguido que funcione, si tengo tiempo (que lo dudo :() ya lo miraré con más calma.
Ah y gracias por la otra manera de generar randoms, si me fuera necesario lo utilizaré!
slopal
Perlero nuevo
Perlero nuevo
 
Mensajes: 78
Registrado: 2005-11-23 11:41 @528

Notapor slopal » 2006-04-03 13:31 @605

Siguiendo el ejemplo anterior:

explorer escribiste:1.- Entra en el directorio tmp/: chdir /var/www/misitioweb/tmp;
2.- Haces un listado con todas las imágenes disponibles: my @imagenes = <imagen*.gif>;
3.- Haces un bucle por todas ellas y te cargas todas las viejas:
foreach my $imagen ( @imagenes ) {
unlink $imagen if -M $imagen > 3; # Borrar en caso de tener más de 3 días
}


he intentado crear lo mismo, con mis rutas y tal y no me funciona.

Primero, chdir lo tengo que hacer en un system? pq suelto no lo entiende (syntax error), y system no me funciona (una larga historia)... alguna otra forma?

Y luego, para buscar las imagenes, el * no me lo entiende :(
he probado en el mismo directorio donde estar a hacer un ulink de *.temp (ficheros creados alli) y no los borra, en cambio poniendo el nombre ..dfslfdf.temp concreto, sí. pq puede ser?
slopal
Perlero nuevo
Perlero nuevo
 
Mensajes: 78
Registrado: 2005-11-23 11:41 @528

AnteriorSiguiente

Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 11 invitados

cron