Trabalhar com uploads de arquivos, especialmente no front end, sempre foi um incômodo. Não costumávamos ser capazes de arrastar e soltar arquivos, uploads AJAX completos, fornecimento de vários arquivos e, diabos, não podíamos obter nenhuma informação sobre o arquivo até que ele chegasse ao servidor; o senhor precisaria fazer o upload do maldito arquivo antes de poder rejeitá-lo!


Atualmente, temos a API de arquivos que nos fornece acesso a informações de arquivos via JavaScript e um input[type=file] . Vamos dar uma olhada em como a API de arquivos funciona!


Acesso a arquivos


Para obter a lista de arquivos mapeados para um determinado input[type=file], o usuário usa o comando files propriedade:



// Assuming <input type="file" id="upload" multiple>

var uploadInput = document.getElementById('upload');

uploadInput.addEventListener('change', function() {
	console.log(uploadInput.files) // File listing!
});


Infelizmente o FileList não tem um forEach como o Array, portanto, precisaremos fazer um looping antigo no FileList:



for (var i = 0, fileCount = uploadInput.files.length; i < fileCount; i++) {
  console.log(files[i]);
}


É importante observar que o FileList tem um length propriedade.


Obtendo informações sobre arquivos


Cada arquivo no FileList fornece um bom conjunto de informações sobre cada arquivo, incluindo o tamanho do arquivo, o tipo MIME, a data da última modificação e o nome:



{
	lastModified: 1428005315000,
	lastModifiedDate: Thu Apr 02 2015 15:08:35 GMT-0500 (CDT),
	name: "profile.pdf",
	size: 135568,
	type: "application/pdf",
	webkitRelativePath: ""
}


O que é bom em obter essas informações sobre o arquivo é que o senhor pode fazer uma validação muito básica antes de fazer o upload do arquivo. Por exemplo, o senhor pode validar o tipo MIME ou o tamanho total do arquivo:



var maxAllowedSize = 500000;

for (var i = 0, fileCount = uploadInput.files.length, totalSize = 0; i  maxAllowedSize) {
		// Notify the user that their file(s) are too large
	}

	if(files[i].type != 'application/pdf') {
		// Notify of invalid file type for file in question
	}
}


O tamanho total do arquivo é muito grande ou um arquivo não passa no teste? Agora o senhor pode apresentar uma mensagem ao usuário sem precisar carregar e avaliar o arquivo primeiro.


Essa é a minha rápida olhada na API File. Trata-se de uma API simples que pode poupar ao senhor e ao seu usuário algum tempo perdido com upload. Há muito mais coisas que podem ser feitas com a API de arquivos, muitas das quais o senhor pode encontrar em MDN.