The FileReader Interface
The FileReader
interface provides a number of methods that can be used to read either File
or Blob
objects. These methods are all asynchronous which means that your program will not stall whilst a file is being read. This is particularly useful when dealing with large files.
The following code shows how to create a new instance of FileReader
.
var reader = new FileReader();
In the following sections we are going to take a look at the methods provided by FileReader
.
readAsText()
The readAsText()
method can be used to read text files. This method has two parameters. The first parameter is for the File
or Blob
object that is to be read. The second parameter is used to specify the encoding of the file. This second parameter is optional. If you don’t specify an encoding UTF-8
is assumed by default.
As this is an asynchronous method we need to setup an event listener for when the file has finished loading. When the onload
event is called we can examine the result
property of our FileReader
instance to get the file’s contents. You will need to use this same approach for all of the read methods provided by FileReader
.
var reader = new FileReader(); reader.onload = function(e) { var text = reader.result; } reader.readAsText(file, encoding);
readAsDataURL()
The readAsDataURL()
method takes in a File
or Blob
and produces a data URL. This is basically a base64 encoded string of the file data. You can use this data URL for things like setting the src
property for an image. We will look at how to do this later in the images demo.
var reader = new FileReader(); reader.onload = function(e) { var dataURL = reader.result; } reader.readAsDataURL(file);
readAsBinaryString()
The readAsBinaryString()
method can be used to read any type of file. The method returns the raw binary data from the file. If you use readAsBinaryString()
along with the XMLHttpRequest.sendAsBinary()
method you can upload any file to a server using JavaScript.
var reader = new FileReader(); reader.onload = function(e) { var rawData = reader.result; } reader.readAsBinaryString(file);
readAsArrayBuffer()
The readAsArrayBuffer()
method will read a Blob
or File
object and produce an ArrayBuffer
. An ArrayBuffer
is a fixed-length binary data buffer. They can come in handy when manipulating files (like converting a JPEG image to PNG).
var reader = new FileReader(); reader.onload = function(e) { var arrayBuffer = reader.result; } reader.readAsArrayBuffer(file);
abort()
The abort()
method will stop a read operation. This can come in handy when reading large files.
reader.abort();
Now that you have an understanding of how the FileReader
API works lets take a look at a couple of examples.
Example: Reading Text Files With The FileReader API
See the Demo Download The Code View on CodePen
In this section you are going to learn how to build a small JavaScript application that reads a text file and displays it’s contents within a <pre>
element.
To get started we first need to setup the HTML for our demo. We are going to use a file <input>
to handle selecting our file but you could also use drag and drop. We also need to add a <pre>
element that will be used for displaying the file’s contents.
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title>File API</title> <link rel="stylesheet" href="style.css"> </head> <body> <div id="page-wrapper"> <h1>Text File Reader</h1> <div> Select a text file: <input type="file" id="fileInput"> </div> <pre id="fileDisplayArea"></pre> </div> <script src="text.js"></script> </body> </html>
You can find a copy of the stylesheet used in this demo in the code resources.
Now it’s time to start writing the JavaScript code for your application. Create a new file called text.js
to house this code.
First we need to get references to the important elements within our HTML. Here we get references to the file <input>
and the <pre>
element and store them in variables called fileInput
and fileDisplayArea
. We also setup an event listener on the fileInput
that listens for the change
event. This will be fired whenever the user selects a file.
window.onload = function() { var fileInput = document.getElementById('fileInput'); var fileDisplayArea = document.getElementById('fileDisplayArea'); fileInput.addEventListener('change', function(e) { // Put the rest of the demo code here. }); }
Now we need to write the code that will handle reading the text file. We first fetch the first file from our input by examining the fileInput
s files
property and store this in a variable called file
. We then create another variable called textType
that holds a regular expression that we will use later to test that the selected file is indeed a text file.
var file = fileInput.files[0]; var textType = /text.*/;
In this next block of code we first check to make sure that the selected file is a text file by testing it’s type
property. If the file is not a text file we show a File not supported!
message on the page.
Once we have determined that the file type is correct we create a new instance of FileReader
. Next we setup an event listener for the onload
event. Within this event listener we add some code that will update the innerText
property of fileDisplayArea
using the result
property from our FileReader
.
Finally we call the readAsText()
method, passing in the file
variable that we created earlier.
if (file.type.match(textType)) { var reader = new FileReader(); reader.onload = function(e) { fileDisplayArea.innerText = reader.result; } reader.readAsText(file); } else { fileDisplayArea.innerText = "File not supported!"; }
If you load up the live demo you should be able to select a file from your local hard drive and see it’s contents displayed on the page.
Example: Reading Image Files With The FileReader API
See the Demo Download The Code View on CodePen
For our next demo we are going to create an application that reads an image file and then displays that image on the page. To do this we are going to be using the readAsDataURL()
method.
The HTML markup for this demo is very similar to the HTML we used before. The main difference is that we are now using a <div>
element as our fileDisplayArea
rather than a <pre>
. Note that the name of the JavaScript file has also changed to images.js
.
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title>File API</title> <link rel="stylesheet" href="style.css"> </head> <body> <div id="page-wrapper"> <h1>Image File Reader</h1> <div> Select an image file: <input type="file" id="fileInput"> </div> <div id="fileDisplayArea"></div> </div> <script src="images.js"></script> </body> </html>
The initial JavaScript code for this demo is exactly the same as before. We get references to the key elements in our HTML and then setup an event listener for the file <input>
.
window.onload = function() { var fileInput = document.getElementById('fileInput'); var fileDisplayArea = document.getElementById('fileDisplayArea'); fileInput.addEventListener('change', function(e) { // Put the rest of the demo code here. }); }
Next we start by fetching the first file from fileInput
. We then create the regular expression for checking the file type. This time we want an image file so the regular expression is: /image.*/
.
As before, we do a check to make sure that the selected file is indeed an image.
We’re now at the point where things start to get a little different. We start by creating a new instance of FileReader
and then setting up an event listener for the onload
event.
When this event listener is called we first need to clear out fileDisplayArea
just in case there is already an image in there. We can do this by setting fileDisplayArea.innerHTML
to an empty string.
Next we create a new Image
instance and set it’s src
property to the data URL that is generated by readAsDataURL()
. Remember, the data URL can be accessed from the FileReader
‘s result
property. We then add img
to the fileDisplayArea
using appendChild()
.
Finally we issue a call to readAsDataURL()
and pass in the selected image file.
var file = fileInput.files[0]; var imageType = /image.*/; if (file.type.match(imageType)) { var reader = new FileReader(); reader.onload = function(e) { fileDisplayArea.innerHTML = ""; // Create a new image. var img = new Image(); // Set the img src property using the data URL. img.src = reader.result; // Add the image to the page. fileDisplayArea.appendChild(img); } reader.readAsDataURL(file); } else { fileDisplayArea.innerHTML = "File not supported!"; }
Load up the live demo and select a file from your hard drive. You should see that the file is display on the page. If you were to use the browser’s developer tools to examine the <img>
element you would see that the src
attribute has been set using the data URL for the image you selected.
Browser Support for the FileReader API
Browser support for the FileReader
API is pretty good. The API will work in the latest versions of all the major desktop browsers. It’s worth noting that Internet Explorer only started supporting FileReader
in IE10.
IE | Firefox | Chrome | Safari | Opera |
---|---|---|---|---|
10+ | 3.6+ | 6.0+ | 6.0+ | 11.1+ |
Source: http://caniuse.com/filereader
Final Thoughts
Historically there has been a big divide between the capabilities of a native app and that of an application built with pure web technologies. Whilst I don’t deny that this gap still exists, APIs like FileReader
are really helping to close up the divide.
In this post you have learned how to use the FileReader
API to read a file from the user’s hard drive and display it’s contents on the page. If you feel like a challenge why not try to create an application that allows the user to drop a file onto the page rather than using an <input>
element. My previous post on implementing native drag and drop should help to get you started.
Useful Links
from:http://blog.teamtreehouse.com/reading-files-using-the-html5-filereader-api