files/en-us/web/api/filereader/index.md
{{APIRef("File API")}}{{AvailableInWorkers}}
The FileReader interface lets web applications asynchronously read the contents of files (or raw data buffers) stored on the user's computer, using {{domxref("File")}} or {{domxref("Blob")}} objects to specify the file or data to read.
File objects may be obtained from a {{domxref("FileList")}} object returned as a result of a user selecting files using the <input type="file"> element, or from a drag and drop operation's {{domxref("DataTransfer")}} object. FileReader can only access the contents of files that the user has explicitly selected; it cannot be used to read a file by pathname from the user's file system. To read files on the client's file system by pathname, use the File System Access API. To read server-side files, use {{domxref("Window/fetch", "fetch()")}}, with CORS permission if reading cross-origin.
{{InheritanceDiagram}}
FileReader object.See Using files from web applications for details and examples.
{{domxref("FileReader.error")}} {{ReadOnlyInline}}
{{domxref("FileReader.readyState")}} {{ReadOnlyInline}}
: A number indicating the state of the FileReader. This is one of the following:
| Name | Value | Description |
|---|---|---|
EMPTY | 0 | No data has been loaded yet. |
LOADING | 1 | Data is currently being loaded. |
DONE | 2 | The entire read request has been completed. |
{{domxref("FileReader.result")}} {{ReadOnlyInline}}
readyState will be DONE.result attribute contains an {{jsxref("ArrayBuffer")}} representing the file's data.result attribute contains the raw binary data from the file as a string.result attribute contains a data: URL representing the file's data.result attribute contains the contents of the file as a text string. An optional encoding name can be specified.Listen to these events using {{domxref("EventTarget/addEventListener", "addEventListener()")}} or by assigning an event listener to the oneventname property of this interface. Remove the event listeners with {{domxref("EventTarget.removeEventListener", "removeEventListener()")}}, once FileReader is no longer used, to avoid memory leaks.
This example reads and displays the contents of a text file directly in the browser.
<h1>File Reader</h1>
<input type="file" id="file-input" />
<div id="message"></div>
<pre id="file-content"></pre>
const fileInput = document.getElementById("file-input");
const fileContentDisplay = document.getElementById("file-content");
const messageDisplay = document.getElementById("message");
fileInput.addEventListener("change", handleFileSelection);
function handleFileSelection(event) {
const file = event.target.files[0];
fileContentDisplay.textContent = ""; // Clear previous file content
messageDisplay.textContent = ""; // Clear previous messages
// Validate file existence and type
if (!file) {
showMessage("No file selected. Please choose a file.", "error");
return;
}
if (!file.type.startsWith("text")) {
showMessage("Unsupported file type. Please select a text file.", "error");
return;
}
// Read the file
const reader = new FileReader();
reader.onload = () => {
fileContentDisplay.textContent = reader.result;
};
reader.onerror = () => {
showMessage("Error reading the file. Please try again.", "error");
};
reader.readAsText(file);
}
// Displays a message to the user
function showMessage(message, type) {
messageDisplay.textContent = message;
messageDisplay.style.color = type === "error" ? "red" : "green";
}
{{EmbedLiveSample("Using FileReader", 640, 300)}}
{{Specifications}}
{{Compat}}