File and FileReader
The File API lets users select files from their device. FileReader reads the contents โ as text, data URL, or ArrayBuffer.
The File Object
A File is a Blob with additional metadata:
file.name // "photo.jpg"
file.size // 102400 (bytes)
file.type // "image/jpeg"
file.lastModified // timestamp
Getting Files from Input
<input type="file" id="file-input" multiple>
document.getElementById('file-input').addEventListener('change', function(e) {
const files = e.target.files; // FileList
for (const file of files) {
console.log(file.name, file.size, file.type);
}
});
Demo: File Input Info
HTML
<div>
<input type='file' id='file-input' multiple style='margin-bottom:8px;'>
<pre id='file-info' style='background:#f1f5f9;padding:12px;border-radius:6px;min-height:60px;'></pre>
</div> JavaScript
document.getElementById('file-input').addEventListener('change', function(e) {
const out = document.getElementById('file-info');
const files = e.target.files;
if (files.length === 0) {
out.textContent = 'No files selected';
return;
}
let info = 'Selected ' + files.length + ' file(s):\\n';
for (const file of files) {
const sizeKB = (file.size / 1024).toFixed(1);
const date = new Date(file.lastModified).toLocaleDateString();
info += '\\n ' + file.name + '\\n' +
' Size: ' + sizeKB + ' KB\\n' +
' Type: ' + (file.type || 'unknown') + '\\n' +
' Modified: ' + date + '\\n';
}
out.textContent = info;
}); Live Output Window
Reading Files with FileReader
FileReader reads the content asynchronously:
const reader = new FileReader();
reader.onload = function(e) {
console.log(e.target.result); // the file contents
};
reader.onerror = function(e) {
console.error('Error reading file');
};
reader.readAsText(file); // as string
reader.readAsDataURL(file); // as base64 data URL
reader.readAsArrayBuffer(file); // as ArrayBuffer
Demo: FileReader Methods
HTML
<div>
<input type='file' id='reader-file' style='margin-bottom:8px;'>
<div style='display:flex;gap:8px;margin-bottom:8px;'>
<button id='read-text'>Read as Text</button>
<button id='read-dataurl'>Read as Data URL</button>
</div>
<pre id='reader-out' style='background:#f1f5f9;padding:12px;border-radius:6px;min-height:60px;word-break:break-all;'></pre>
</div> JavaScript
const fileInput = document.getElementById('reader-file');
const out = document.getElementById('reader-out');
function readFile(method) {
const file = fileInput.files[0];
if (!file) {
out.textContent = 'Please select a file first';
return;
}
const reader = new FileReader();
reader.onload = function(e) {
const result = e.target.result;
if (method === 'text') {
out.textContent = 'Text content (' + result.length + ' chars):\\n' + result;
} else {
out.textContent = 'Data URL (' + result.length + ' chars):\\n' + result.substring(0, 200) + '...';
}
};
reader.onerror = function() {
out.textContent = 'Error reading file';
};
if (method === 'text') reader.readAsText(file);
else reader.readAsDataURL(file);
out.textContent = 'Reading file...';
}
document.getElementById('read-text').onclick = () => readFile('text');
document.getElementById('read-dataurl').onclick = () => readFile('dataurl'); Live Output Window
Drag and Drop Files
Files can also be obtained via drag and drop:
dropZone.addEventListener('dragover', function(e) {
e.preventDefault();
});
dropZone.addEventListener('drop', function(e) {
e.preventDefault();
const files = e.dataTransfer.files;
// process files
});
Demo: Drag & Drop Files
HTML
<style>
#drop-zone { width: 100%; height: 150px; border: 2px dashed #6366f1; border-radius: 8px; display: flex; align-items: center; justify-content: center; background: #f1f5f9; transition: all 0.3s; }
#drop-zone.dragover { background: #eef2ff; border-color: #4f46e5; transform: scale(1.02); }
</style>
<div id='drop-zone'>Drop files here</div>
<pre id='drop-info' style='background:#f1f5f9;padding:12px;border-radius:6px;'></pre> JavaScript
const zone = document.getElementById('drop-zone');
const out = document.getElementById('drop-info');
zone.addEventListener('dragover', function(e) {
e.preventDefault();
this.classList.add('dragover');
});
zone.addEventListener('dragleave', function() {
this.classList.remove('dragover');
});
zone.addEventListener('drop', function(e) {
e.preventDefault();
this.classList.remove('dragover');
const files = e.dataTransfer.files;
if (files.length === 0) {
out.textContent = 'No files dropped';
return;
}
let info = 'Dropped ' + files.length + ' file(s):\\n';
for (const file of files) {
info += '\\n ' + file.name + ' (' + (file.size / 1024).toFixed(1) + ' KB)';
}
out.textContent = info;
}); Live Output Window
FileReader Events
| Event | When |
|---|---|
loadstart | Read starts |
progress | During read (for large files) |
load | Read complete |
error | Read failed |
abort | Read cancelled |
loadend | Read finished (success or fail) |
Reading Images as DataURL
Display a user-selected image:
const reader = new FileReader();
reader.onload = function(e) {
img.src = e.target.result; // data URL
};
reader.readAsDataURL(file);
Key Takeaways
FileextendsBlobโ hasname,size,type,lastModified- Get files from
<input type="file">or drag-and-drop FileReaderreads files as text, data URL, or ArrayBuffer- FileReader is async โ use
onload/onerrorcallbacks - For images, use
readAsDataURL()and set asimg.src - Modern alternative:
file.text(),file.arrayBuffer(),file.stream() - Always handle
onerrorโ files can fail to read (corrupted, permissions)