33

I have a string which needs to be downloaded in a txt file when click on a button. How can this be implemented using React?

Chris
  • 53,920
  • 18
  • 108
  • 124
Akash Sateesh
  • 642
  • 2
  • 7
  • 15

1 Answers1

86

Here's a working example. Enter the text in the input field and click Download txt, this will download a txt with the contents you entered in the input.

This solution creates a new Blob object of the text MIME type and attaches it to the href of a temporary anchor (<a>) element which is then triggered programmatically.

A Blob object represents a file-like object of immutable, raw data. Blobs represent data that isn't necessarily in a JavaScript-native format.


class MyApp extends React.Component {
  downloadTxtFile = () => {
    const element = document.createElement("a");
    const file = new Blob([document.getElementById('myInput').value], {type: 'text/plain'});
    element.href = URL.createObjectURL(file);
    element.download = "myFile.txt";
    document.body.appendChild(element); // Required for this to work in FireFox
    element.click();
  }
  
  render() {
    return (
      <div>
        <input id="myInput" />
        <button onClick={this.downloadTxtFile}>Download txt</button>
      </div>
    );
  }
}

ReactDOM.render(<MyApp />, document.getElementById("myApp"));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="myApp"></div>

This answer was derived from thanhpk's post.

Chris
  • 53,920
  • 18
  • 108
  • 124
  • so, what you're actually saying is this question is a duplicate. – Kevin B Jun 20 '17 at 20:10
  • 3
    @KevinB, not really. The linked question does not explain the solution, nor is it a question related to react. Marking this as a dupe to that question would not be very helpful to OP nor to future readers. I explain the solution and provide a working sample, which is more helpful than said post. But why don't you mark it as a dupe yourself if you think it is? – Chris Jun 20 '17 at 20:26
  • 1
    i was debating on closing it in the opposite direction. as you said, this is a much more useful QA pair. – Kevin B Jun 20 '17 at 20:27
  • 2
    For some reason this code does nothing in Firefox for me( – Anton Duzenko Oct 25 '18 at 11:23
  • 2
    Firefox requires the element to be appended to the body before the click. document.body.appendChild(element) – Robin Larsson Mar 08 '19 at 08:22
  • Hi, thanks for this fast solution, but it fails for me for large string of text, the Click handler in chrome fails. – Vikas Saini Dec 19 '19 at 07:33
  • for me its working with Incognito mode but not working in normal mode using chrome, any suggestion? – Abhishek Tomar Jan 13 '21 at 15:50
  • @AbhishekTomar where did you try this? on your own website? – Chris Jan 13 '21 at 17:03
  • Yes; trying on my own site using localhost. – Abhishek Tomar Jan 15 '21 at 18:15