Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Можно ли при помощи JS узнать размер файла(аудио), на клиенте? (https://javascript.ru/forum/misc/65603-mozhno-li-pri-pomoshhi-js-uznat-razmer-fajjla-audio-na-kliente.html)

alexKl 28.10.2016 17:06

Можно ли при помощи JS узнать размер файла(аудио), на клиенте?
 
Задача - узнать размер трека. Загружать не катит ибо файлов много. Это возможно?

(файлы на сервере)

Aetae 28.10.2016 18:08

HEAD запросом, если сервер отдаёт размер. Примерно так
function getFileSize(url, callback){
  function promise(resolve){
    var req = new XMLHttpRequest();
    req.open('HEAD', url, true);
    req.onreadystatechange = () => {
      if(req.readyState === 2){
        var size = req.getResponseHeader('Content-Length');
        if(!size){
          if (size = /\bsize=([^;]+)/.exec(req.getResponseHeader('Content-Disposition'))) 
            size = size[1];
        }
        req.abort(); //чтоб не грузил лишнего
        resolve(+size || 0);
      }
    };
    req.onerror = req.ontimeout = () => resolve(0);
    req.send(null);
  }
  
  if(callback) return promise(callback);
  return new Promise(promise);
}

alexKl 28.10.2016 19:21

Спасибо, то что нужно)

Опан 28.10.2016 20:08

Цитата:

Сообщение от Aetae (Сообщение 433281)
var req = new XMLHttpRequest();

Это на клиенте? :)
<input type="file" id="myfile" onchange="rdfile(this.files)">

<script>
var reader = new FileReader();
function rdfile(files){
	reader.readAsArrayBuffer(files[0]);
	reader.onload = function(e){
		var arr=new Int8Array(e.target.result);
		alert("Ваш файл в байтах: " + arr.length);
	}
}
</script>

Aetae 28.10.2016 20:21

Цитата:

Сообщение от Опан (Сообщение 433297)
Это на клиенте? :)

Цитата:

Сообщение от alexKl (Сообщение 433269)
(файлы на сервере)


Но если говорить о клиенте, то совершенно не нужно грузить весь файл в память, да ещё и пихать в массив, чтоб узнать его размер. Это сверхъизбыточно.
<input type="file" id="myfile" onchange="alert(files[0].size)">

Опан 28.10.2016 20:35

А вот просто alert(e.target.result.length); выдаёт undefined.

Aetae 28.10.2016 21:02

Опан, а должен что-то другое? Почитайте спецификацию, или ли хотя бы справку по методам и свойствам, не придётся городить извращения. У буффера например не "length", а "byteLength". Не знаю, честно говоря, нафига отошли от привычного стандарта, но наверное были некие веские причины.*с сомнением пожал плечами*


Часовой пояс GMT +3, время: 23:21.