11548 sujets

JavaScript, DOM et API Web HTML5

Modérateur
bonjour,

pour mon site de recette je cherche a me faire un formulaire permettant d'editer ou ajouter une recette, avec la possibilité d'envoyer un fichier image.

Le publique que je connais en partie , est bien souvent peut habituer aux ordinateur et je souhaitais ajouter des fonctionnalités "rassurante" , comme la previsualisation d'une image avant l'upload.
Mes test me conduisent a reussir avec IE et ff . mais je comprend pas pourquoi cela ne marche pas dans opera ?

Pour infos : ff lance le script apres l'ouverture de la boite de dialogue , IE avant , .... c'est le pourquoi du commentaire conditionnel.

page d'essai a copier coller et a essayer en local (pas besoin d'envoyer l'imlage Smiley smile ou que se soit ):
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 

"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
<head>
<title>TEST -  Aperçu image avant upload</title>
<style type='text/css'>
* {float:left;clear:left;}
img {padding:10px;border:#555 solid 3px;margin:5px;background:#999;}
p {overflow:hidden;background:#eee;text-align:center;width:225px;border:1px solid #000;}
span {border:1px solid #000;width:223px;border-top:2px solid #000}
</style>
<script type='text/javascript'>
function voirimg() {
var imgsrc=document.getElementById('monchamp').value;
apercu='file:///'+imgsrc;         //pour ff entre autre 
document.getElementById('lavoir').src= apercu;
}

function voirIE()
{
voirimg();
tailleit();
}

function tailleit() {
var timg="";
          timg = document.getElementById('lavoir').fileSize;
 var tailleimg = document.createElement("span");
 var  lataille = document.createTextNode('taille en octets :'+ timg );

 tailleimg.appendChild(lataille);

  var affiche = document.getElementById("info");

 affiche.appendChild(tailleimg);
}
</script>
</head>
<body>
<form>
<input type="file" id="monchamp" onclick="voirimg();" />
<p id="info">
<img src="#" alt="" id ='lavoir' height='190' width='190'   />

</p>
<imput type="Submit" id="go" name="go" value= "upload" />
<!--[if IE]><p onclick="voirIE();">afficher l'aperçu</p><! endif -->
</form>
</body>
</html>


j'ai essayer aussi en creant a la volée l'attribut "src" dans la balise image ... mais la c'est IE qui est dans les choux.

est ce perdu d'avance ?

gcyrillus
Modifié par gcyrillus (28 Sep 2006 - 00:03)
Tient ça me fait penser... (le fait d'essayer la page en local).

Avant tout je ne dit pas pour toi, ni sans doute pour aucun habitant alsacration city (ça fait mieux que alsacreatien ... ça peut ce dire ?),
ni sans doute à la plupart des développeurs web mais le fait d'enregistrer un fichier en local (une page HTML, en register le contenu d'une page HTML dans un nouveaux fichier HTML), est une erreur de sécurité critique.
En effet lorsque vous allez executer la page qui va peut être contenir du script client, il est possible que ce script est accès à tout vos fichiers de votre ordinateur et de transmettre des informations vers l'extrieure, c'est cepandant limité : accès seulement en lecture, ne fonctionne pas si vous avez désactivé l'ECMAScript (javascript), si votre navigateur ne supporte pas l'XMLHTTPRequest, si vous avez un antivirus qui sait bloquer ce genre de manipe (ça existe ?), si vous avez IE (en effet ça fait des erreurs system ...), si vous afficher la page très peut de temps ... mais ça peut ne pas suffir.

Le system est simple. La recommendation (je sais plus la quel) indique que le navigateur (et le serveur) ne doit pas permettre à un script client d'acceder à un domaine autre que celui sur lequel il est (www.exemple.com, mais pas www.google.com, ni sub.exemple.com, ni sub.exemple.com:90, ni https://www.exemple.com ...).

Il suffit alors sur une page en local de faire des requêtes XMLHTTPRequest (bah oui la page est en local donc elle a le droit de faire des requêtes en local). Une requête aura comme réponse (en fonction du navigateur) la réponse du contenu du dossier (si c'est un dossier, il suffit de tapper le chemin du dossier dans son navigateur pour ce rendre compte de ce qu'il affiche) en forme d'index (tailles, nom, ...) sous forme HTML ou le contenu du fichier (si c'est un fichier). Donc déja de ce point de vue il est facile d'acceder à n'importe quel fichiers ou informations sur un fichier.
Il y a tout de même une exeption : IE, et la on se dit ... "comme toujours !". En effet comme le moteur d'IE est intégré dans l'explorateur. Si on affiche le contenu d'un fichier (par la barre d'adresse), c'est le navigateur de fichier que prend le relais, d'où une erreur bizarre.

Après on peut faire ce que l'on veut des informations récupérées ... les envoyer sur un serveur distant par exemple (désolé si ça donne de mauvaises idées à certains, mais il y en a sans doute qui ont exploré le problème avant moi). Et ça en apprelant une image par exemple (en passant les infos dans l'URL) ou même par l'intermédiaire d'un formulaire qui ce valide tout seul et qui passe en post les infos (limité tout de même).

Donc je dit prudence quand vous téléchargez un fichier, même si c'est une simple page HTML (on sais pas ce qui ce cache derrière)

Par contre je n'ai pas testé sur un autre OS, mais le problème doit être sensiblement le même.
Modifié par heyman85 (28 Sep 2006 - 09:54)
Modérateur
hehe , oui ça merite un test en ligne !

bon le truc rechercher en final est toujours le même .

verifier la taille d'un fichier et son type mime avant envoi , les photos d'appariel numerique avoisinent parfois les 7 mo de nos jours (de petit programme simple et gratuit savent les redimensionner efficacement ), et même en retaillant l'image a l'arriver avec la librairie gd et sans limite de taille depassé par l'hebergeur , c'est longuet , voir frustrant tout ça !

Coté securité , je ne vois pas le danger de visualiser, chez soi ,un fichier que l'on s'apprete a envoyer , d'ailleurs , il n'y a rien a voir avant d'avoir decide de selectioné un fichier image.


Merci de ta "reflexion" .

je testerais en ligne demain
++
Modérateur
bon , Smiley decu test fait !

IE , ne pose aucun probleme , mais firefoxe refuse obstinement d'afficher l'image et pourtant le lien vers l'image est bien inseré dans la balise image.(opera pas tester , le js ne marchait deja pas en local )

tester :
balise image avec le lien ecrit dans le source --> en ligne , pas d'affichage
image en background css --> en ligne , pas d'affichage
dans une balise object ou iframe --> en ligne , pas d'affichage
l'image dans un dossier partagé ?? --> en ligne , pas d'affichage

bon a tourné autour du pot sans jamais l'atteindre , Smiley smile j'arrive a me faire une raison , quelque soit les simples methodes tester ... pas de "failles" de la part de ff Smiley smile . bien ! oui mais non .

Donc un petit blabla d'aide suffira a accompagné "l'upload d'image" au cas ou il ne savent pas comment faire ...

merci a tous


<edit>
la config par defaut dans firefoxe qui ne charge pas le fichier image (ou autre) :

user_pref("security.checkloaduri", false);


et en usant d'un certificat une piste:
http://martial.braux.free.fr/articles/certification.html
Modifié par gcyrillus (29 Sep 2006 - 01:47)