32

I would like to know if I can create a text file and save the file in the users "Downloads" section in his/her computer using Javascript. The way my feature should work is when the user clicks the submit button, I populate the users info in the text file and then save it in his machine. I would like this to work in Google Chrome.

Is this possible? I have seen posts that specifically tell me that it is a serious security issue.

Brian Tompsett - 汤莱恩
5,92772 gold badges64 silver badges135 bronze badges
asked Aug 23, 2011 at 12:01
3
  • stackoverflow.com/questions/3665115/… Commented Aug 23, 2011 at 12:04
  • 1
    i did look at that. but i did not understand how i can populate the file based on users entry. Commented Aug 23, 2011 at 12:06
  • 2
    He even specifically asked about Chrome. Commented Aug 23, 2011 at 12:07

9 Answers 9

42

Sure you can, using the brand new APIs.

 window.requestFileSystem = window.requestFileSystem || window.webkitRequestFileSystem;
 window.requestFileSystem(window.TEMPORARY, 1024*1024, function(fs) {
 fs.root.getFile('test.bin', {create: true}, function(fileEntry) { // test.bin is filename
 fileEntry.createWriter(function(fileWriter) {
 var arr = new Uint8Array(3); // data length
 arr[0] = 97; // byte data; these are codes for 'abc'
 arr[1] = 98;
 arr[2] = 99;
 var blob = new Blob([arr]);
 fileWriter.addEventListener("writeend", function() {
 // navigate to file, will download
 location.href = fileEntry.toURL();
 }, false);
 fileWriter.write(blob);
 }, function() {});
 }, function() {});
}, function() {});
Hgbanana
301 silver badge4 bronze badges
answered Aug 23, 2011 at 12:11
Sign up to request clarification or add additional context in comments.

9 Comments

when i tried executing this code, i was directed to a link locally. it did not have contents in it. i wanted a text file so i changed the name and followed the instructions on html5rocks.com/en/tutorials/file/filesystem
@Praveen: I missed a few things. Please see my updated code. Does the new fiddle work correctly?
navigating to a file does not seem to download it. Your example works well but mine navigates to a link and not downloading.
@Praveen: Not sure then; for me it starts downloading test.bin. What extension are you using? Perhaps that matters.
@pimvdb The link is broken
|
11

Enter this into the Chrome browser

data:text;charset=utf-8,helloWorld

So to construct the download for your users you would do something like

data='<a href='data:text;charset=utf-8,'+uriEncode(yourUSERdataToDownload)+' >Your Download</a>

Then inject it into the dom for your user to press.

RAM
2,4191 gold badge24 silver badges33 bronze badges
answered Aug 23, 2011 at 12:20

5 Comments

Haha Ty thats what I thought when I found it =)
how would you go about setting the filename of the downloaded file? I get an extensionless file named 'download', is there any way to change that?
@Flater: Use the download attribute. It works on Chrome and allows you to download any contents with any file name.
No more message passing nonsense and trying to use various APIs only to find they're deprecated. Thanks!
Your welcome , check out window.location = "mailto:[email protected]?Subject=Hello%20again" also !
7

The following method works in IE11+, Firefox 25+ and Chrome 30+:

<a id="export" class="myButton" download="" href="#">export</a>
<script>
 function createDownloadLink(anchorSelector, str, fileName){
 if(window.navigator.msSaveOrOpenBlob) {
 var fileData = [str];
 blobObject = new Blob(fileData);
 $(anchorSelector).click(function(){
 window.navigator.msSaveOrOpenBlob(blobObject, fileName);
 });
 } else {
 var url = "data:text/plain;charset=utf-8," + encodeURIComponent(str);
 $(anchorSelector).attr("download", fileName); 
 $(anchorSelector).attr("href", url);
 }
 }
 $(function () {
 var str = "hi,file";
 createDownloadLink("#export",str,"file.txt");
 });
</script>

See this in Action: http://jsfiddle.net/Kg7eA/

Firefox and Chrome support data URI for navigation, which allows us to create files by navigating to a data URI, while IE doesn't support it for security purposes.

On the other hand, IE has API for saving a blob, which can be used to create and download files.

answered Dec 27, 2013 at 7:00

2 Comments

This appears to no longer work in chrome. To fix it see stackoverflow.com/a/23956661/945687 which does work.
Where is it possible to find explanations on what's going on in this?
5

Try this:

document.body.innerHTML+="<a id='test' href='data:text;charset=utf-8,"+encodeURIComponent("hi")+"'>Your Download</a>";
document.getElementById('test').click();

if you want to set the filename use download attribute of anchor tag:

document.body.innerHTML+="<a id='test' href='data:text;charset=utf-8,"+encodeURIComponent("hi")+"' download=yourfilename>Your Download</a>";
document.getElementById('test').click();
Hackaholic
19.8k6 gold badges59 silver badges77 bronze badges
answered May 6, 2013 at 12:17

2 Comments

Pretty amazing... but how can I set the filename? I got "Download" as filename, without extension.
@YanKingYin Use download="filename" as an attribute of the A tag.
0

You will need server side functionality in order to server the user a text file (javascript is not enough). You can create a server side script that creates the file and use javascript in order to prompt user to save it.

answered Aug 23, 2011 at 12:06

Comments

0

On Submit button from user, you can create file on server and redirect user to url of the file, from where it should get automatically downloaded.

answered Aug 23, 2011 at 12:06

2 Comments

Automatically downloaded? Says who?
i mean at server end, after saving file at server and redirect user to the url which points to the file (www.domain.com/abc.txt), then it will automatically prompt user to save file at client side....
0

No, as that would allow you to create malicious programs in the client's computer, and harm his privacy.

Also, requests to download files come from the server, so you'll need to create the file on the server, and serve it to the user, and hope he'll save it (if he requested for it it's likely that he will).

Another possible solution to look at is to use data URIs or CSVs, but browser support for them is incomplete (IE), see Create a file in memory for user to download, not through server

answered Aug 23, 2011 at 12:06

Comments

-2
var isIE = /*@cc_on!@*/ false || !! document.documentMode; // At least IE6
var uri = "some data"; //data in file
var fileName = "file.i4cvf"; // any file name with any extension
if (isIE) {
 var fileData = ['\ufeff' + uri];
 var blobObject = new Blob(fileData);
 window.navigator.msSaveOrOpenBlob(blobObject, fileName);
} else //chrome
{
 window.requestFileSystem = window.requestFileSystem || window.webkitRequestFileSystem;
 window.requestFileSystem(window.TEMPORARY, 1024 * 1024, function (fs) {
 fs.root.getFile(fileName, {
 create: true
 }, function (fileEntry) {
 fileEntry.createWriter(function (fileWriter) {
 var fileData = ['\ufeff' + uri];
 var blob = new Blob(fileData);
 fileWriter.addEventListener("writeend", function () {
 var fileUrl = fileEntry.toURL();
 var link = document.createElement('a');
 link.href = fileUrl;
 link.download = fileName;
 document.body.appendChild(link);
 link.click();
 document.body.removeChild(link);
 }, false);
 fileWriter.write(blob);
 }, function () {});
 }, function () {});
 }, function () {});
}
Sebastian Brosch
43.8k15 gold badges78 silver badges89 bronze badges
answered Nov 25, 2015 at 13:12

1 Comment

pls add a more detailed explanation - stackoverflow.com/help/how-to-answer
-2

This link helped me a lot and solved my problem. Cross browser solution:

https://www.thewebflash.com/reading-and-creating-text-files-using-the-html5-file-api/

This is the most relevant part:

if ('msSaveOrOpenBlob' in navigator) {
 navigator.msSaveOrOpenBlob(textFileAsBlob, fileName);
} else {
 var downloadLink = document.createElement('a');
 downloadLink.download = fileName;
 downloadLink.innerHTML = 'Download File';
 if ('webkitURL' in window) {
 // Chrome allows the link to be clicked
 // without actually adding it to the DOM.
 downloadLink.href = window.webkitURL.createObjectURL(textFileAsBlob);
 } else {
 // Firefox requires the link to be added to the DOM
 // before it can be clicked.
 downloadLink.href = window.URL.createObjectURL(textFileAsBlob);
 downloadLink.onclick = destroyClickedElement;
 downloadLink.style.display = 'none';
 document.body.appendChild(downloadLink);
 }
 downloadLink.click();
}
cezar
12.1k6 gold badges51 silver badges92 bronze badges
answered Jan 16, 2018 at 10:00

1 Comment

A link to a solution is welcome, but please ensure your answer is useful without it: add context around the link so your fellow users will have some idea what it is and why it’s there, then quote the most relevant part of the page you're linking to in case the target page is unavailable. Answers that are little more than a link may be deleted.

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.