Skip to content

JavaScript File and FileReader

In the modern web development landscape, managing files efficiently and securely is essential. JavaScript, which is key to client-side scripting, provides strong tools through the File and FileReader interfaces. This guide offers a detailed look at these tools, giving developers the skills to handle files smoothly within web applications.

Understanding the File Interface in JavaScript

The File interface in JavaScript is an object representing file data. Files typically originate from <input type="file"> elements, Drag and Drop operations, or the Clipboard API. This interface provides standard information such as name, size, and MIME type, along with methods to access the file's content.

Key Properties of the File Interface

  • name: The name of the file as a string.
  • size: The size of the file in bytes.
  • type: The MIME type of the file as a string.

Example: Displaying File Information

Here's a simple way to display information about a file selected by the user:


html
<input type="file" id="fileInput" />
<div id="fileInfo"></div>
javascript
document.getElementById('fileInput').addEventListener('change', function(event) {
  const file = event.target.files[0];
  const info = `File Name: ${file.name} <br> File Size: ${file.size} bytes<br> File Type: ${file.type}`;
  document.getElementById('fileInfo').innerHTML = info;
});

Leveraging the FileReader API

The FileReader API allows web applications to read the contents of files (or raw data buffers) stored on the user's computer, using File or Blob objects to specify the file or data to read.

FileReader Methods

  • readAsDataURL(): Reads the file as a data URL.
  • readAsText(): Reads the file as text.
  • readAsArrayBuffer(): Reads the file as an ArrayBuffer.

Example: Reading a Text File

The following example demonstrates reading a text file using FileReader and displaying its contents on the webpage:


html
<input type="file" id="textInput" />
<div id="textOutput">Upload a text file please</div>
javascript
document.getElementById('textInput').addEventListener('change', function(event) {
  const file = event.target.files[0];
  const reader = new FileReader();
  reader.onload = function(e) {
    document.getElementById('textOutput').innerHTML = e.target.result;
  };
  reader.onerror = function() {
    document.getElementById('textOutput').innerHTML = 'Error reading file.';
  };
  reader.readAsText(file);
});

Advanced File Reading: Handling Different Data Types

Reading Images as Data URLs

To display an image file selected by the user, you can read it as a Data URL using the readAsDataURL method. This method encodes the file as a base64 encoded string, which can be used directly in image elements.

Example: Displaying an Image


html
<input type="file" id="imageInput" />
<div>Select an image file, please.</div>
<img id="imageDisplay" />
javascript
document.getElementById('imageInput').addEventListener('change', function(event) {
  const file = event.target.files[0];
  const reader = new FileReader();
  reader.onload = function(e) {
    document.getElementById('imageDisplay').src = e.target.result;
  };
  reader.onerror = function() {
    document.getElementById('imageDisplay').style.display = 'none';
    alert('Error reading image file.');
  };
  reader.readAsDataURL(file);
});

Reading Binary Files with ArrayBuffer

For applications that need to process audio, video, or any binary data, reading the file as an ArrayBuffer is essential. This method provides a generic buffer of binary data, which can be manipulated or passed to other APIs like Web Audio or WebGL.

Example: Processing Binary Data


html
<input type="file" id="binaryInput" />
<div id="binaryOutput">Select any file.</div>
javascript
document.getElementById('binaryInput').addEventListener('change', function(event) {
  const file = event.target.files[0];
  const reader = new FileReader();
  reader.onload = function(e) {
    const buffer = e.target.result;
    // Process the binary data
    const info = `Buffer Length: ${buffer.byteLength} bytes`;
    document.getElementById('binaryOutput').innerHTML = info;
  };
  reader.onerror = function() {
    document.getElementById('binaryOutput').innerHTML = 'Error reading binary file.';
  };
  reader.readAsArrayBuffer(file);
});

Conclusion

By understanding and implementing the File and FileReader interfaces in JavaScript, developers can enhance their web applications' interaction with user data. These APIs provide the necessary tools to handle file inputs, read file contents, and utilize data effectively, ensuring a richer and more interactive user experience.

Note: Modern browsers also support file.text() and file.arrayBuffer() for simpler async reading without the FileReader API.

Practice

What are the functionalities of File and FileReader interfaces in JavaScript?

Dual-run preview — compare with live Symfony routes.