Get file size, image width and height before upload

前端 未结 7 1250
自闭症患者
自闭症患者 2020-11-22 03:50

How can I get the file size, image height and width before upload to my website, with jQuery or JavaScript?

相关标签:
7条回答
  • 2020-11-22 04:17

    Here is a pure JavaScript example of picking an image file, displaying it, looping through the image properties, and then re-sizing the image from the canvas into an IMG tag and explicitly setting the re-sized image type to jpeg.

    If you right click the top image, in the canvas tag, and choose Save File As, it will default to a PNG format. If you right click, and Save File as the lower image, it will default to a JPEG format. Any file over 400px in width is reduced to 400px in width, and a height proportional to the original file.

    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

    <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>
    

    Here is a jsFiddle:

    jsFiddle Pick, display, get properties, and Re-size an image file

    In jsFiddle, right clicking the top image, which is a canvas, won't give you the same save options as right clicking the bottom image in an IMG tag.

    0 讨论(0)
  • 2020-11-22 04:18

    A working jQuery validate example:

       $(function () {
            $('input[type=file]').on('change', function() {
                var $el = $(this);
                var files = this.files;
                var image = new Image();
                image.onload = function() {
                    $el
                        .attr('data-upload-width', this.naturalWidth)
                        .attr('data-upload-height', this.naturalHeight);
                }
    
                image.src = URL.createObjectURL(files[0]);
            });
    
            jQuery.validator.unobtrusive.adapters.add('imageminwidth', ['imageminwidth'], function (options) {
                var params = {
                    imageminwidth: options.params.imageminwidth.split(',')
                };
    
                options.rules['imageminwidth'] = params;
                if (options.message) {
                    options.messages['imageminwidth'] = options.message;
                }
            });
    
            jQuery.validator.addMethod("imageminwidth", function (value, element, param) {
                var $el = $(element);
                if(!element.files && element.files[0]) return true;
                return parseInt($el.attr('data-upload-width')) >=  parseInt(param["imageminwidth"][0]);
            });
    
        } (jQuery));
    
    0 讨论(0)
  • 2020-11-22 04:21

    As far as I know there is not an easy way to do this since Javascript/JQuery does not have access to the local filesystem. There are some new features in html 5 that allows you to check certain meta data such as file size but I'm not sure if you can actually get the image dimensions.

    Here is an article I found regarding the html 5 features, and a work around for IE that involves using an ActiveX control. http://jquerybyexample.blogspot.com/2012/03/how-to-check-file-size-before-uploading.html

    0 讨论(0)
  • 2020-11-22 04:29

    If you can use the jQuery validation plugin you can do it like so:

    Html:

    <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);
            }
    });
    

    The function is passed as ab onload function.

    The code is taken from here

    0 讨论(0)
  • 2020-11-22 04:31

    So I started experimenting with the different things that FileReader API had to offer and could create an IMG tag with a DATA URL.

    Drawback: It doesn't work on mobile phones, but it works fine on Google Chrome.

    $('input').change(function() {
        
        var fr = new FileReader;
        
        fr.onload = function() {
            var img = new Image;
            
            img.onload = function() { 
    //I loaded the image and have complete control over all attributes, like width and src, which is the purpose of filereader.
                $.ajax({url: img.src, async: false, success: function(result){
                		$("#result").html("READING IMAGE, PLEASE WAIT...")
                		$("#result").html("<img src='" + img.src + "' />");
                    console.log("Finished reading Image");
            		}});
            };
            
            img.src = fr.result;
        };
        
        fr.readAsDataURL(this.files[0]);
        
    });
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <input type="file" accept="image/*" capture="camera">
    <div id='result'>Please choose a file to view it. <br/>(Tested successfully on Chrome - 100% SUCCESS RATE)</div>

    (see this on a jsfiddle at http://jsfiddle.net/eD2Ez/530/)
    (see the original jsfiddle that i added upon to at http://jsfiddle.net/eD2Ez/)

    0 讨论(0)
  • 2020-11-22 04:32

    Multiple images upload with info data preview

    Using HTML5 and the File API

    Example using URL API

    The images sources will be a URL representing the Blob object
    <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>

    Example using FileReader API

    In case you need images sources as long Base64 encoded data strings
    <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>
      

    0 讨论(0)
提交回复
热议问题