Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

coder quelque chose de plus malin que

24 réponses
Avatar
Christophe Lohr
Bonjour,
voici mon souci : j'ai un document html composé de plusieurs fichiers
(quelques fichiers html, plus quelques images). La difficulté est que je
dois les déposer sur un site qui gère les fichiers via une base de
donnée. Ainsi on accède aux fichiers par une requête du style :
http://lesiteweb.org/file.php?file=/repertoire/index.html

La conséquence c'est que si mon fichier index.html fait un <IMG
SRC="image.png">, les navigateurs vont le rechercher dans
http://lesiteweb.org/image.png et non pas dans
http://lesiteweb.org/file.php?file=/repertoire/image.png

Bref, il me faut gérer cette URL de base non conventionnelle.
Naïvement, j'ai essayé avec le tag <base href=".."> dans l'entête, mais
bien entendu, il n'est pas pris en compte...

Par conséquent, je pensais qu'il devrait être possible de coder en
javascript une fonction qui d'une part repère la base de l'url du
document html en cours, puis l'ajoute à tous les liens locaux.

Est-ce que c'est faisable cela ?

Merci de votre aide.

Christophe

10 réponses

1 2 3
Avatar
Lionel
Mickaël Wolff wrote:

Tu as déjà essayé de faire un dump d'une base de données contenant
plusieurs centaines de Mo de blobs ?


Très franchement, je ne vois pas le soucis. D'autant plus qu'on peut
procéder à des dumps incrémentaux, qu'on peut faire de la réplication
si jamais un dump devient une contrainte temporel trop grande, les
données sont dans des fichiers en définitives, etc.


Je voulais dire centaines de Go evidemment, pas Mo.
Certes, on peut toujours s'en sortir, mais ce choix me parait loin d'etre
judicieux.

Sachant qu'un paquet de "dba" ne savent pas exclure des tables lorsqu'ils
font un dump...demande leur un dump d'une base de 100Go, tu vas rire.
Ou bien de faire une copie de la prod en recette.


Avatar
Christophe Lohr

Ce n'est pas la base de données qui rend l'image accessible, c'est le
serveur web, soit directement, soit via un script côté serveur (en PHP
dans ton cas).


c'est un peu l'intuition que j'avais du fonctionnement interne du serveur.
Reste que j'ai toujours mon problème : je n'ai pas de base d'url valide
pour accéder à mes documents, et donc que je ne peux pas faire de lien
relatifs...


oui, je suis bien d'accord que c'est une "rustine"
mais vu le fonctionnement du serveur, les utilisateurs qui n'ont pas
de javascript sont de toutes façons bien vite bloqués par ailleurs...


Super.


(t'as oublié le smiley)
mais réjouissons-nous, il n'y a pas encore de Flash (pas encore...)


Avatar
Christophe Lohr
je pensais qu'il devrait être possible de coder en
javascript une fonction qui d'une part repère la base de l'url du
document html en cours, puis l'ajoute à tous les liens locaux.



je pensais à l'algorithme suivant :

- Récupérer l'url du document. À partir de cela, prendre la sous-chaîne
qui va jusqu'au dernier caractère '/', et considérer cela comme l'url de
base

- Parcourir tous les href|src|action|background du document. Pour
chacun, tester si c'est un lien relatif ou absolu. Si c'est un lien
relatif, alors lui ajouter en tête la chaîne "url de base" construite
précédemment.

- Je ne sais pas si il y a déjà des fonctions javascript existantes
permettant de tester si un lien est relatif ou absolu. À défaut, on
pourrait considérer qu'un lien est absolu si il commence par un motif
"<service>://", où <service> est une suite non vide de caractères
alpha-numériques (ou bien on peut donner une liste
http|https|ftp|mailto|etc.)

Est-ce que quelqu'un peut m'aider à coder cela, ou me donner des pistes
pour commencer ?
Merci.

Cordialement.

Avatar
SAM
je pensais qu'il devrait être possible de coder en javascript une
fonction qui d'une part repère la base de l'url du document html en
cours, puis l'ajoute à tous les liens locaux.



je pensais à l'algorithme suivant :

- Récupérer l'url du document. À partir de cela, prendre la sous-chaîne
qui va jusqu'au dernier caractère '/', et considérer cela comme l'url de
base


ce n'est sans doute pas ce qu'il faut faire ...
(qui nous dit que le stock des images sera dans *ce* répertoire ?)
... mais :

<script type="text/javascript">
function resite() {
var url = self.location.toString().split('?file=')[0];
url = url.substring(0, url.lastIndex('/'));
var A = document.links;
for(var i=0; i<A.length; i++) {
if(A[i].href && A[i].href.indexOf('?file=')<0)
A[i].href = url + A[i].href.substring(A[i].href.lastIndex('/')+1);
}
}
window.onload = resite;
</script>

à mettre dans le head
(non testé, comme de juste !)
(les images ne sont pas dans un sous-répertoire du "repertoire")

--
sm


Avatar
Christophe Lohr
je pensais qu'il devrait être possible de coder en javascript une
fonction qui d'une part repère la base de l'url du document html en
cours, puis l'ajoute à tous les liens locaux.



je pensais à l'algorithme suivant :

- Récupérer l'url du document. À partir de cela, prendre la
sous-chaîne qui va jusqu'au dernier caractère '/', et considérer cela
comme l'url de base


ce n'est sans doute pas ce qu'il faut faire ...
(qui nous dit que le stock des images sera dans *ce* répertoire ?)


c'est effectivement le cas

... mais :

<script type="text/javascript">
function resite() {
var url = self.location.toString().split('?file=')[0];
url = url.substring(0, url.lastIndex('/'));
var A = document.links;
for(var i=0; i<A.length; i++) {
if(A[i].href && A[i].href.indexOf('?file=')<0)
A[i].href = url + A[i].href.substring(A[i].href.lastIndex('/')+1);
}
}
window.onload = resite;
</script>


merci pour le coup de pouce.
Je n'ai pas compris pourquoi tu recherchais le '?file='

Mais voici ce à quoi je suis arrivé et qui fait presque ce que je veux :

<script type="text/javascript">
function resite() {
var url = self.location.toString();
var filename =
self.location.pathname.substring(self.location.pathname.lastIndexOf('/')+1);
var basename = url.substring(0, url.indexOf(filename));
url = url.substring(0, url.lastIndexOf('/'));
var A = document.links;
for(var i=0; i<A.length; i++)
if(A[i].href && A[i].href.search(basename)==0 )
A[i].href = url + A[i].href.substring(A[i].href.lastIndexOf('/'));
A = document.images;
for(var i=0; i<A.length; i++)
if(A[i].src && A[i].src.search(basename)==0 )
A[i].src = url + A[i].src.substring(A[i].src.lastIndexOf('/'));
}
window.onload = resite;
</script>



Avatar
SAM
(qui nous dit que le stock des images sera dans *ce* répertoire ?)


c'est effectivement le cas

<script type="text/javascript">
(snip)


</script>


merci pour le coup de pouce.
Je n'ai pas compris pourquoi tu recherchais le '?file='


J'avais compris que c'était un indicateur de lien "normal" relativement
à la base, par opposition aux autres liens relatifs au site.
C'est vrai que pour l'extraction de l'url du répertoire ce n'est pas
obligé, m'enfin c'est un moyen comme un autre.

Bon, j'avais un peu oublié de repérer le répertoire :-/

function resite() {
var url = self.location.search.toString().split('=')[1];
var repertoire = url.substring(0, url.lastIndexOf('/'));
var A = document.links;
var lien = '';
for(var i=0; i<A.length; i++) {
lien = A[i].href;
if(lien && lien.indexOf('?file=')<0)
A[i].href = repertoire + lien.substring(lien.lastIndexOf('/')+1);
}
A = document.images;
for(var i=0; i<A.length; i++) {
lien = A[i].src;
if(lien && lien.length>0 && lien.indexOf('?file=')<0 )
A[i].src = repertoire + lien.substring(lien.lastIndexOf('/')+1);
}
}
window.onload = resite;


Mais voici ce à quoi je suis arrivé et qui fait presque ce que je veux :


Il me semble que là on fait abstraction des liens vers des sites externes ?
et quid des vidéos et autres ?

--
sm


Avatar
Christophe Lohr
(qui nous dit que le stock des images sera dans *ce* répertoire ?)


c'est effectivement le cas

<script type="text/javascript">
(snip)


</script>


merci pour le coup de pouce.
Je n'ai pas compris pourquoi tu recherchais le '?file='


J'avais compris que c'était un indicateur de lien "normal" relativement
à la base, par opposition aux autres liens relatifs au site.
C'est vrai que pour l'extraction de l'url du répertoire ce n'est pas
obligé, m'enfin c'est un moyen comme un autre.

Bon, j'avais un peu oublié de repérer le répertoire :-/

function resite() {
var url = self.location.search.toString().split('=')[1];
var repertoire = url.substring(0, url.lastIndexOf('/'));
var A = document.links;
var lien = '';
for(var i=0; i<A.length; i++) {
lien = A[i].href;
if(lien && lien.indexOf('?file=')<0)
A[i].href = repertoire + lien.substring(lien.lastIndexOf('/')+1);
}
A = document.images;
for(var i=0; i<A.length; i++) {
lien = A[i].src;
if(lien && lien.length>0 && lien.indexOf('?file=')<0 )
A[i].src = repertoire + lien.substring(lien.lastIndexOf('/')+1);
}
}
window.onload = resite;


Mais voici ce à quoi je suis arrivé et qui fait presque ce que je veux :


Il me semble que là on fait abstraction des liens vers des sites externes ?


non, justement, c'est mon test A[i].href.search(basename)==0 qui me dit
si le lien est un lien interne ou non.

Par exemple, si mon document a un <a href="la_suite.html">, et bien
avant traitement, ce lien interne a comme href :
http://www.lesite.org/machin/la_suite.html
Donc pour savoir si je dois le reconstruire ou pas je teste si il
commence par "http://www.lesite.org/machin"
C'est ce que contient ma variable "basename".

En effet, supposons que le document soit localisé à
http://www.lesite.org/machin/file.php?file=/repertoire/index.html

var url = self.location.toString();
C'est ce que contient la variable url

var filename =
self.location.pathname.substring(self.location.pathname.lastIndexOf('/')+1);

Ici, self.location.pathname vaut "machin/file.php"
Donc mon filename vaut "file.php"

var basename = url.substring(0, url.indexOf(filename));
Là le basename vaut "http://www.lesite.org/machin"

url = url.substring(0, url.lastIndexOf('/'));
Et maintenant mon url vaut
http://www.lesite.org/machin/file.php?file=/repertoire



et quid des vidéos et autres ?


Ca, j'en n'ai pas. Par contre j'ai des feuilles de style css.
<LINK rel="stylesheet" type="text/css" href="main.css">

Pour les traiter j'ai ajouté :
A = document.getElementsByTagName("LINK");
for(var i=0; i<A.length; i++)
....

Bon, en toutes rigueur il faudrait que je boucle également sur "link",
"script" etc.
(mais j'en n'ai pas dans mon document, donc je me limite à ça)



Avatar
SAM
(qui nous dit que le stock des images sera dans *ce* répertoire ?)


c'est effectivement le cas

<script type="text/javascript">
(snip)


</script>


merci pour le coup de pouce.
Je n'ai pas compris pourquoi tu recherchais le '?file='




finalement, à la relecture de ce que tu dis ...

src="photo.png"
qui doit devenir :
src="http://www.lesite.org/machin/file.php?file=/repertoire/photo.png"
ou :
src="file.php?file=/repertoire/photo.png"

Je cherchais à faire le contraire (ne pas appeler la base) :-(

alors, peut-être que :

var url = self.location.search.toString();
url = url.substring(0, url.lastIndexxOf('/')); // ?file=/repertoire/

A[i].href = 'file.php'+url+ lien.substring(lien.lastIndexOf('/')+1)


--
sm




Avatar
Christophe Lohr

finalement, à la relecture de ce que tu dis ...

src="photo.png"
qui doit devenir :
src="http://www.lesite.org/machin/file.php?file=/repertoire/photo.png"
ou :
src="file.php?file=/repertoire/photo.png"


bin, voyant que le contenu de mes liens que j'ai écris comme étant
relatifs dans le html ressortent dans le javascript avec l'adresse
complète, je me suis dis que c'était l'adresse complète qu'il fallait
reconstruire
... donc, solution 1

c'est ce que j'ai cherché à faire, et visiblement, ça marche, donc je
suis content :-)
(mais il y a certainement pleins d'effets de bords ou de cas
non-traités, mais ça passe pour mon document cible ;-) )

Avatar
Pierre Goiffon
Christophe Lohr wrote:
je pensais qu'il devrait être possible de coder en javascript une
fonction qui d'une part repère la base de l'url du document html en
cours, puis l'ajoute à tous les liens locaux.


je pensais à l'algorithme suivant :

- Récupérer l'url du document. À partir de cela, prendre la sous-chaîne
qui va jusqu'au dernier caractère '/', et considérer cela comme l'url de
base

- Parcourir tous les href|src|action|background du document. Pour
chacun, tester si c'est un lien relatif ou absolu. Si c'est un lien
relatif, alors lui ajouter en tête la chaîne "url de base" construite
précédemment.


Et donc les navigateurs sans support JavaScript n'auront aucune des
ressources externes appelées, CSS, JS, images, etc ? Pas bon...


1 2 3