Vous pouvez le faire sur les navigateurs qui prennent en charge la nouvelle File API du W3C, en utilisant la fonction readAsDataURL
sur l'interface FileReader
et attribuer l'URL de données à la src
d'un img
(après quoi vous pouvez lire le height
et width
du image). Firefox 3.6 supporte actuellement l'API de fichiers, et je pense que Chrome et Safari l'ont déjà fait ou sont sur le point de le faire.
Ainsi, votre logique au cours de la phase de transition serait quelque chose comme ceci:
détecter si le navigateur prend en charge l'API File (qui est facile: if (typeof window.FileReader === 'function')
).
Si c'est le cas, génial, lisez les données localement et insérez-les dans une image pour trouver les dimensions.
Sinon, téléchargez le fichier sur le serveur (en soumettant probablement le formulaire à partir d'un iframe pour éviter de quitter la page), puis interrogez le serveur pour connaître la taille de l'image (ou demandez simplement l'image tu préfères).
Modifier Je voulais travailler jusqu'à un exemple de l'API File pendant un certain temps; en voici un:
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-type" content="text/html;charset=UTF-8">
<title>Show Image Dimensions Locally</title>
<style type='text/css'>
body {
font-family: sans-serif;
}
</style>
<script type='text/javascript'>
function loadImage() {
var input, file, fr, img;
if (typeof window.FileReader !== 'function') {
write("The file API isn't supported on this browser yet.");
return;
}
input = document.getElementById('imgfile');
if (!input) {
write("Um, couldn't find the imgfile element.");
}
else if (!input.files) {
write("This browser doesn't seem to support the `files` property of file inputs.");
}
else if (!input.files[0]) {
write("Please select a file before clicking 'Load'");
}
else {
file = input.files[0];
fr = new FileReader();
fr.onload = createImage;
fr.readAsDataURL(file);
}
function createImage() {
img = document.createElement('img');
img.onload = imageLoaded;
img.style.display = 'none'; // If you don't want it showing
img.src = fr.result;
document.body.appendChild(img);
}
function imageLoaded() {
write(img.width + "x" + img.height);
// This next bit removes the image, which is obviously optional -- perhaps you want
// to do something with it!
img.parentNode.removeChild(img);
img = undefined;
}
function write(msg) {
var p = document.createElement('p');
p.innerHTML = msg;
document.body.appendChild(p);
}
}
</script>
</head>
<body>
<form action='#' onsubmit="return false;">
<input type='file' id='imgfile'>
<input type='button' id='btnLoad' value='Load' onclick='loadImage();'>
</form>
</body>
</html>
Fonctionne bien sur Firefox 3.6. J'ai évité d'utiliser n'importe quelle bibliothèque là, donc des excuses pour les gestionnaires d'événements de style d'attribut (DOM0) et autres.
+1, c'est le moyen de le faire. – YOU
Merci pour l'exemple! – Pointy
J'ai utilisé votre solution pour vérifier l'orientation des images avant de les télécharger via iOS Safari (puisque iOS supprime beaucoup de données exif pendant le téléchargement, par exemple l'orientation). J'ai trouvé que les dimensions étaient incorrectes si l'image affichait: aucune (elle confondait largeur et hauteur en mode portrait). Ma façon de le résoudre était de lui donner une position absolue de gauche -10000px ou plus. De toute façon, merci pour votre travail. Cela m'a sauvé de beaucoup de maux de tête supplémentaires. – stafffan