OVH Cloud OVH Cloud

Afficher une image en RAM parmi du texte

19 réponses
Avatar
Asterbing
Bonjour,

Je souhaite afficher une série de toutes petites images (telle que celle
ici dans $img de 55 octets) en mémoire RAM, sans passer par un fichier
disque temporaire (à moins de savoir créer de la ramdisk en quelques
lignes Perl ;-)). Alors, j'ai essayé ça :

#!/usr/bin/perl -T
use strict;
use warnings;

my $img = pack("C*", 0x47, 0x49, 0x46, 0x38, 0x37, 0x61, 0x08, 0x00,
0x08, 0x00, 0x91, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xA6, 0xCA, 0xF0, 0x2A,
0x5F, 0xFF, 0x00, 0x00, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
0x08, 0x00, 0x00, 0x02, 0x10, 0x8C, 0x7F, 0xA2, 0x3B, 0xB1, 0xEC, 0x9E,
0x68, 0x72, 0xC6, 0x47, 0x65, 0x1B, 0xBC, 0x8F, 0x02, 0x00, 0x3B);

print "Content-type: text/html\n\n";
print "<p>Ceci est une image :</p>";
print $img;
print "<p>C'est tout !</p>";
exit 0;

Si je retire la ligne "... Ceci est une image ...", l'image en question
s'affiche bien dans le navigateur, mais la ligne "... C'est tout !" est
ignorée.

Si je laisse la ligne "... Ceci est une image ...", j'obtiens la phrase,
puis le contenu de l'image interprété en tant que texte et la dernière
ligne de texte.

L'idéal serait bien sûr de passer par un truc comme "print <img
src="display_image_value.cgi"></img>"; avec l'image POStée
(puisqu'impossible de passer les data de l'image en GET sur l'url elle-
même), mais comment simule-t-on le POST sans formulaire et son action ?

Suis-je sûr la/les mauvaise(s) voie(s) ? Comment faire ?

9 réponses

1 2
Avatar
Asterbing
In article ,
says...
Le Sat, 29 Apr 2006 13:08:06 +0200, Asterbing a écrit :

Ensuite, sur vos conseils, j'ai tenté alt.html parce que je ne pense pas
qu'il s'agisse de quelque chose de couramment pratiqué en html, mais de
la recherche d'une voie alternative.


Sur fr.* le groupe html,cgi a effectivement un nom épouvantable :
<news:fr.comp.infosystemes.www.auteurs>.



Merci de l'info, je n'aurais effectivement pas deviné.


Avatar
Asterbing
In article <e2vjnp$q8l$, nicolas$
says...
Asterbing wrote in message
:
afraid of GET because of lengh
url limitation, knowing my largest images may be of 10KB, while smallest
50 bytes


Cette parenthèse suffit à montrer que comme je le soupçonnais il y a un gros
problème de compréhension des mécanismes mis en jeu à la base. Mais je n'ai
vraiment aucune envie de perdre du temps à expliquer ça à quelqu'un qui
méprise mes explications et mes conseils.



Si je te présente mes excuses quant à la méprise que tu as pu ressentir,
te demande dans le même temps de ne pas ignorer ce que j'ai dis sur le
mode de communication (la forme, pas le fond), es-tu satisfait ?


Avatar
Gauthier
Bonjour,

Le Fri, 28 Apr 2006 15:19:18 +0200, Asterbing a écrit:
Bonjour,

Je souhaite afficher une série de toutes petites images (telle que celle
ici dans $img de 55 octets) en mémoire RAM, sans passer par un fichier
disque temporaire (à moins de savoir créer de la ramdisk en quelques
lignes Perl ;-)). Alors, j'ai essayé ça :

print "Content-type: text/htmlnn";
print "<p>Ceci est une image :</p>";
print $img;
print "<p>C'est tout !</p>";
exit 0;

Suis-je sûr la/les mauvaise(s) voie(s) ? Comment faire ?


Si l'essentiel est de ne pas stocker les images sur le disque, il me
semble qu'il vaudrait mieux utiliser deux scripts CGI, l'un renvoyant du
code html, l'autre une/des image(s). On aurait alors

print "Content-type: text/htmlnn";
print "<p>Ceci est une image :</p>";
print "<p><img src="/cgi-bin/make_image.pl?argument=quelquechose"></p>";
print "<p>C'est tout !</p>";
exit 0;

--
^^ Gauthier
(_____/°°-ç
| _`-"
)/@mmm||
nn nn FOE-Belgium : http://www.amisdelaterre.be

Avatar
Asterbing
In article ,
says...
print "<p><img src="/cgi-bin/make_image.pl?argument=quelquechose"></p>";



Oui, mais justement, que serait cet argument ? Si c'est le chemin du
fichier à renvoyer vers le navigateur, pas de problème, mais je n'évite
alors pas le passage par un fichier disque côté serveur.

Il s'agirait donc pour mon cas de mettre directement les data de l'image
(encodées base64) en argument... Mais, quoique certains disent y
arriver, il existe une limite en taille selon les serveurs (j'ai lu des
choses comme 8KB pour Apache2, sais pas si c'est exact).

Avatar
Gauthier
Le Sun, 30 Apr 2006 21:12:23 +0200, Asterbing a écrit:
In article ,
says...
print "<p><img src="/cgi-bin/make_image.pl?argument=quelquechose"></p>";



Oui, mais justement, que serait cet argument ?


J'ai proposé ici d'ajouter un argument en partant de l'idée que le
script make_image.pl pouvait créer plusieurs images différentes,
et donc qu'il fallait passer un argument pour choisir l'image
(si on écrit un script pour une image, autant stocker les images directement...)
Il s'agit bien d'images qui sont créées "à la volée" et non pas stockées
sur le disque. Tu avais donné dans ton exemple initial un bout de code
qui envoyait sur la sortie standard les données binaires de l'image;
il suffit d'imaginer dans ce script plusieurs fonctions semblables
créant des images différentes, et de faire appel à la fonction désirée
avec un argument qui peut être une simple valeur numérique (1,2,3...).

On peut aussi imaginer un script unique qui, selon les arguments, produit des
pages html ou des images. Ainsi un lien

http://www.truc.org/index.pl?page¬cueil

produirait une page html comprenant elle-même une ligne

<img src="http://www.truc.org/index.pl?image=logo" />

Tes difficultés proviennent du fait que tu as un script qui envoit
en une fois des types de données différentes (du texte et des images),
et ça coince avec le protocole http. Dans ce que je propose, tu as un
script qui s'appelle lui-même de façon récursive; il envoie
successivement du texte, puis une image.

--
^^ Gauthier
(_____/°°-ç
| _`-"
)/@mmm||
nn nn


Avatar
Patrick Jacquot
Le Sat, 29 Apr 2006 09:50:43 +0200, kurtz le pirate a écrit :

Alors, si je vais sur alt.html, viendras-tu me livrer LA solution ? Je
n'attends que ça : la solution... Puisque le chemin passant par data:
URI ne fonctionne pas dans Internet Explorer.


peut être justement que sur *.html, tu auras plus de réponses. le
problème (html je répète), c'est que ie ne supporte pas la construction
que Nicolas George a donné qui fonctionne bien avec d'autres vrais
navigateurs... et là, on s'éloigne encore de ce forum sur perl !


mauvais navigateur --> changer navigateur :-)

--
Patrick


Avatar
Gauthier
Le Fri, 28 Apr 2006 15:19:18 +0200, Asterbing a écrit:
print "Content-type: text/htmlnn";
print "<p>Ceci est une image :</p>";
print $img;
print "<p>C'est tout !</p>";
exit 0;

Si je retire la ligne "... Ceci est une image ...", l'image en question
s'affiche bien dans le navigateur, mais la ligne "... C'est tout !" est
ignorée.


Ça me semble logique: après l'en-tête http, les données envoyées sont une
image ; un navigateur comme InternetExplorer, si je ne me trompe,
outrepasse l'en-tête (stratégie discutable, mais c'est un autre
débat...) et reconnait l'image, donc, elle s'affiche.

Si je laisse la ligne "... Ceci est une image ...", j'obtiens la phrase,
puis le contenu de l'image interprété en tant que texte et la dernière
ligne de texte.


Dans ce cas, les premières données étant du texte, ce qui suit est
interprété de la même manière, donc l'image s'afiche sous forme de
texte, ainsi que tout ce qui suit.

Tes autres interlocuteurs n'ont pas tort, tes problèmes relèvent de la
compréhension des mécanismes http, pas de Perl.

Cordialement,
--
^^ Gauthier
(_____/°°-ç
| _`-"
)/@mmm||
nn nn

Avatar
Asterbing
In article ,
says...
J'ai proposé ici d'ajouter un argument en partant de l'idée que le
script make_image.pl pouvait créer plusieurs images différentes,
et donc qu'il fallait passer un argument pour choisir l'image
(si on écrit un script pour une image, autant stocker les images directement...)



Je suis 'accord pour tout le reste de ton post, sauf ça. Un truc qui
n'étais peut-être pas clair dans ma demande initiale : ces images ne
peuvent provenir d'une liste figées qui serait hardcodée dans un script
Perl, puis retournées à la demande via un argument de type index (pour
choisir quelle image de la liste renvoyer vers le navigateur). Non non,
il s'agit en fait d'images construites (en RAM) à partir d'info saisies
par l'utilisateur-visiteur. Aucune n'est semblable à la précédente et je
ne peux donc pas stocker de liste prédéfinie.

Avatar
Asterbing
In article ,
says...
Si je retire la ligne "... Ceci est une image ...", l'image en question
s'affiche bien dans le navigateur, mais la ligne "... C'est tout !" est
ignorée.


Ça me semble logique: après l'en-tête http, les données envoyées sont une
image ; un navigateur comme InternetExplorer, si je ne me trompe,
outrepasse l'en-tête (stratégie discutable, mais c'est un autre
débat...) et reconnait l'image, donc, elle s'affiche.

Si je laisse la ligne "... Ceci est une image ...", j'obtiens la phrase,
puis le contenu de l'image interprété en tant que texte et la dernière
ligne de texte.


Dans ce cas, les premières données étant du texte, ce qui suit est
interprété de la même manière, donc l'image s'afiche sous forme de
texte, ainsi que tout ce qui suit.



J'ai compris cette "particularité" de IE plus tard, après ce post
initial.

Tes autres interlocuteurs n'ont pas tort, tes problèmes relèvent de la
compréhension des mécanismes http, pas de Perl.


Je ne contestais pas le fond, juste la forme.

Cordialement,
Cordialement aussi



1 2