在上传到我的网站之前,如何使用 jQuery 或 JavaScript 获取文件大小、图像高度和宽度?
上传前获取文件大小、图像宽度和高度
使用信息数据预览上传多张图像
使用HTML5 和文件 API
使用URL API 的示例
图像源将是表示 Blob 对象的URL
<img src="blob:null/026cceb9-edr4-4281-babb-b56cbf759a3d">
const EL_browse  = document.getElementById('browse');
const EL_preview = document.getElementById('preview');
const readImage  = file => {
  if ( !(/^image\/(png|jpe?g|gif)$/).test(file.type) )
    return EL_preview.insertAdjacentHTML('beforeend', `Unsupported format ${file.type}: ${file.name}<br>`);
  const img = new Image();
  img.addEventListener('load', () => {
    EL_preview.appendChild(img);
    EL_preview.insertAdjacentHTML('beforeend', `<div>${file.name} ${img.width}×${img.height} ${file.type} ${Math.round(file.size/1024)}KB<div>`);
    window.URL.revokeObjectURL(img.src); // Free some memory
  });
  img.src = window.URL.createObjectURL(file);
}
EL_browse.addEventListener('change', ev => {
  EL_preview.innerHTML = ''; // Remove old images and data
  const files = ev.target.files;
  if (!files || !files[0]) return alert('File upload not supported');
  [...files].forEach( readImage );
});
#preview img { max-height: 100px; }
<input id="browse" type="file" multiple>
<div id="preview"></div>
使用FileReader API 的示例
如果您需要像 Base64 编码的数据字符串一样长的图像源
<img src="data:image/png;base64,iVBORw0KGg...     ...lF/++TkSuQmCC=">
const EL_browse  = document.getElementById('browse');
const EL_preview = document.getElementById('preview');
const readImage = file => {
  if ( !(/^image\/(png|jpe?g|gif)$/).test(file.type) )
    return EL_preview.insertAdjacentHTML('beforeend', `<div>Unsupported format ${file.type}: ${file.name}</div>`);
  const reader = new FileReader();
  reader.addEventListener('load', () => {
    const img  = new Image();
    img.addEventListener('load', () => {
      EL_preview.appendChild(img);
      EL_preview.insertAdjacentHTML('beforeend', `<div>${file.name} ${img.width}×${img.height} ${file.type} ${Math.round(file.size/1024)}KB</div>`);
    });
    img.src = reader.result;
  });
  reader.readAsDataURL(file);  
};
EL_browse.addEventListener('change', ev => {
  EL_preview.innerHTML = ''; // Clear Preview
  const files = ev.target.files;
  if (!files || !files[0]) return alert('File upload not supported');
  [...files].forEach( readImage );
});
#preview img { max-height: 100px; }
<input id="browse" type="file"  multiple>
<div id="preview"></div>
  
演示
不确定它是否是你想要的,但只是简单的例子:
var input = document.getElementById('input');
input.addEventListener("change", function() {
    var file  = this.files[0];
    var img = new Image();
    img.onload = function() {
        var sizes = {
            width:this.width,
            height: this.height
        };
        URL.revokeObjectURL(this.src);
        console.log('onload: sizes', sizes);
        console.log('onload: this', this);
    }
    var objectURL = URL.createObjectURL(file);
    console.log('change: file', file);
    console.log('change: objectURL', objectURL);
    img.src = objectURL;
});
如果您可以使用 jQuery 验证插件,您可以这样做:
网址:
<input type="file" name="photo" id="photoInput" />
JavaScript:
$.validator.addMethod('imagedim', function(value, element, param) {
  var _URL = window.URL;
        var  img;
        if ((element = this.files[0])) {
            img = new Image();
            img.onload = function () {
                console.log("Width:" + this.width + "   Height: " + this.height);//this will give you image width and height and you can easily validate here....
                return this.width >= param
            };
            img.src = _URL.createObjectURL(element);
        }
});
该函数作为 ab onload 函数传递。
代码取自here
这是一个纯 JavaScript 示例,它选择图像文件,显示它,循环图像属性,然后将画布中的图像重新调整大小为 IMG 标记,并将重新调整大小的图像类型显式设置为 jpeg。
如果您右键单击画布标签中的顶部图像,然后选择将文件另存为,它将默认为 PNG 格式。如果您右键单击并将文件另存为下方图像,它将默认为 JPEG 格式。任何宽度超过 400 像素的文件都会缩小到 400 像素的宽度,高度与原始文件成正比。
HTML
<form class='frmUpload'>
  <input name="picOneUpload" type="file" accept="image/*" onchange="picUpload(this.files[0])" >
</form>
<canvas id="cnvsForFormat" width="400" height="266" style="border:1px solid #c3c3c3"></canvas>
<div id='allImgProperties' style="display:inline"></div>
<div id='imgTwoForJPG'></div>
脚本
<script>
window.picUpload = function(frmData) {
  console.log("picUpload ran: " + frmData);
var allObjtProperties = '';
for (objProprty in frmData) {
    console.log(objProprty + " : " + frmData[objProprty]);
    allObjtProperties = allObjtProperties + "<span>" + objProprty + ": " + frmData[objProprty] + ", </span>";
};
document.getElementById('allImgProperties').innerHTML = allObjtProperties;
var cnvs=document.getElementById("cnvsForFormat");
console.log("cnvs: " + cnvs);
var ctx=cnvs.getContext("2d");
var img = new Image;
img.src = URL.createObjectURL(frmData);
console.log('img: ' + img);
img.onload = function() {
  var picWidth = this.width;
  var picHeight = this.height;
  var wdthHghtRatio = picHeight/picWidth;
  console.log('wdthHghtRatio: ' + wdthHghtRatio);
  if (Number(picWidth) > 400) {
    var newHeight = Math.round(Number(400) * wdthHghtRatio);
  } else {
    return false;
  };
    document.getElementById('cnvsForFormat').height = newHeight;
    console.log('width: 400  h: ' + newHeight);
    //You must change the width and height settings in order to decrease the image size, but
    //it needs to be proportional to the original dimensions.
    console.log('This is BEFORE the DRAW IMAGE');
    ctx.drawImage(img,0,0, 400, newHeight);
    console.log('THIS IS AFTER THE DRAW IMAGE!');
    //Even if original image is jpeg, getting data out of the canvas will default to png if not specified
    var canvasToDtaUrl = cnvs.toDataURL("image/jpeg");
    //The type and size of the image in this new IMG tag will be JPEG, and possibly much smaller in size
    document.getElementById('imgTwoForJPG').innerHTML = "<img src='" + canvasToDtaUrl + "'>";
};
};
</script>
这是一个jsFiddle:
在 jsFiddle 中,右键单击顶部图像(画布)不会为您提供与右键单击 IMG 标签中的底部图像相同的保存选项。
据我所知,没有一种简单的方法可以做到这一点,因为 Javascript/JQuery 无法访问本地文件系统。html 5 中有一些新功能可以让您检查某些元数据,例如文件大小,但我不确定您是否真的可以获得图像尺寸。
这是我找到的一篇关于 html 5 功能的文章,以及涉及使用 ActiveX 控件的 IE 解决方法。http://jquerybyexample.blogspot.com/2012/03/how-to-check-file-size-before-uploading.html