J'ai un contrôle de téléchargement pour télécharger les images sur le serveur, mais avant de télécharger, je veux simplement m'assurer que les images ont des dimensions correctes. Y a-t-il quelque chose du côté client qui peut être fait avec javascript?
Vous pouvez les vérifier avant de soumettre le formulaire:
window.URL = window.URL || window.webkitURL;
$("form").submit( function( e ) {
var form = this;
e.preventDefault(); //Stop the submit for now
//Replace with your selector to find the file input in your form
var fileInput = $(this).find("input[type=file]")[0],
file = fileInput.files && fileInput.files[0];
if( file ) {
var img = new Image();
img.src = window.URL.createObjectURL( file );
img.onload = function() {
var width = img.naturalWidth,
height = img.naturalHeight;
window.URL.revokeObjectURL( img.src );
if( width == 400 && height == 300 ) {
form.submit();
}
else {
//fail
}
};
}
else { //No file was input or browser doesn't support client side reading
form.submit();
}
});
Cela ne fonctionne que sur les navigateurs modernes, il vous reste donc à vérifier les dimensions côté serveur. Vous ne pouvez pas non plus faire confiance au client, c’est une autre raison pour laquelle vous devez quand même vérifier leur côté serveur.
Oui, l'API HTML5 prend en charge cela.
var _URL = window.URL || window.webkitURL;
$("#file").change(function(e) {
var image, file;
if ((file = this.files[0])) {
image = new Image();
image.onload = function() {
alert("The image width is " +this.width + " and image height is " + this.height);
};
image.src = _URL.createObjectURL(file);
}
});
DÉMO (testé sur chrome)
Pour simplifier les choses, utilisez un cadre de traitement d’images javascript tel que fabric.js , processing.js et MarvinJ .
Dans le cas de MarvinJ , charge simplement l'image du côté client et utilise les méthodes getWidth () et getHeight () pour vérifier les dimensions de l'image. Avec les dimensions, vous pouvez autoriser la soumission du fichier ou informer l'utilisateur de la dimension incompatible.
Exemple:
var image = new MarvinImage();
image.load("https://i.imgur.com/oOZmCas.jpg", imageLoaded);
function imageLoaded(){
document.getElementById("result").innerHTML += image.getWidth()+","+image.getHeight();
}
<script src="https://www.marvinj.org/releases/marvinj-0.8.js"></script>
<div id="result"></div>
Peut-être un peu tard, mais voici une version ES6 moderne de la réponse acceptée en utilisant des promesses
const getUploadedFileDimensions: file => new Promise((resolve, reject) => {
try {
let img = new Image()
img.onload = () => {
const width = img.naturalWidth,
height = img.naturalHeight
window.URL.revokeObjectURL(img.src)
return resolve({width, height})
}
img.src = window.URL.createObjectURL(file)
} catch (exception) {
return reject(exception)
}
})
Tu appellerais ça comme ça
getUploadedFileDimensions(file).then(({width, height}) => {
console.log(width, height)
})
Si vous n'avez pas besoin de gérer les fichiers svg et que vous pouvez vous limiter à navigateurs les plus récents , vous pouvez utiliser la fonction createImageBitmap
pour créer une promesse doublure:
if(typeof createImageBitmap !== "function") {
console.error("Your browser doesn't support this method");
// fallback to URL.createObjectURL + <img>
}
inp.oninput = e => {
createImageBitmap(inp.files[0])
.then((bmp) => console.log(bmp.width, bmp.height))
.catch(console.error);
}
<input type="file" id="inp" accept="image/*">