Получите размер файла, ширину и высоту изображения перед загрузкой


98

Как я могу получить размер файла, высоту и ширину изображения перед загрузкой на мой сайт с помощью jQuery или JavaScript?


2
эта ссылка очень полезна: developer.mozilla.org/en-US/docs/Web/API/FileReader/…
Stardust

1
Вот пошаговое руководство по получению имени, типа и размера файла codepedia.info/…
Сатиндер Сингх

Спасибо Вам за Ваш вопрос . Мамнун
Мохаммадали Мирхамед

Ответы:


174

Загрузка нескольких изображений с предварительным просмотром информационных данных

Использование HTML5 и файлового API

Пример использования URL API

Источниками изображений будет URL-адрес, представляющий объект Blob.
<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>
  


1
@SMC caniuse.com/fileapi только недавно поддерживает File API. Я посмотрю
Роко С. Бульян

когда значение i отображается в функции обратного вызова reader.onload, оно показывает случайное приращение! например, для 4 файлов значение предупреждения было 0 3 2 1. Кто-нибудь может это объяснить?
freerunner

@freerunner: ваши файлы имеют разный размер, поэтому не загружаются одновременно.
Роко С. Бульян

К сожалению, это требует двойной загрузки изображения. Было бы намного лучше, если бы мы могли получить ширину и высоту как свойства файла, такие как тип файла.
MrFox


8

Если вы можете использовать плагин проверки jQuery, вы можете сделать это так:

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

Функция передается как функция загрузки.

Код взят отсюда


'this' в this'files [0] не имеет значения. Его необходимо изменить на element.files [0], чтобы он работал.
jetlej

Как добиться этого для множественного выбора файлов?
Шайк Низамуддин

7

Демо

Не уверен, что это то, что вы хотите, но просто простой пример:

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

3

Вот пример чистого 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 Выбор, отображение, получение свойств и изменение размера файла изображения

В jsFiddle щелчок правой кнопкой мыши по верхнему изображению, которое является холстом, не даст вам тех же параметров сохранения, что и щелчок правой кнопкой мыши по нижнему изображению в теге IMG.


1

Насколько я знаю, сделать это непросто, поскольку Javascript / JQuery не имеет доступа к локальной файловой системе. В html 5 есть некоторые новые функции, которые позволяют вам проверять определенные метаданные, такие как размер файла, но я не уверен, действительно ли вы можете получить размеры изображения.

Вот статья, которую я нашел о функциях html 5, а также об обходе IE, которое включает использование элемента управления ActiveX. http://jquerybyexample.blogspot.com/2012/03/how-to-check-file-size-before-uploading.html


1

Итак, я начал экспериментировать с различными вещами, которые может предложить FileReader API, и мог создать тег IMG с URL-адресом DATA.

Недостаток: не работает на мобильных телефонах, но отлично работает в 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>

(см. это в jsfiddle по адресу http://jsfiddle.net/eD2Ez/530/ )
(см. исходный jsfiddle, который я добавил на http://jsfiddle.net/eD2Ez/ )


0

Рабочий пример проверки jQuery:

   $(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));
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.