Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

starting file download with JavaScript

Let's say I have download links for files on my site.

When clicked these links send an AJAX request to the server which returns the URL with the location of the file.

What I want to do is direct the browser to download the file when the response gets back. Is there a portable way to do this?

like image 895
Vasil Avatar asked Dec 13 '08 21:12

Vasil


People also ask

How do I trigger a download when clicking HTML button or JavaScript?

To trigger a file download on a button click we will use a custom function or HTML 5 download attribute. The download attribute simply uses an anchor tag to prepare the location of the file that needs to be downloaded.

How do you create a download link in JavaScript?

Creating the download linkCreate an object URL for the blob object. Create an anchor element ( <a></a> ) Set the href attribute of the anchor element to the created object URL. Set the download attribute to the filename of the file to be downloaded.


2 Answers

We do it that way: First add this script.

<script type="text/javascript"> function populateIframe(id,path)  {     var ifrm = document.getElementById(id);     ifrm.src = "download.php?path="+path; } </script> 

Place this where you want the download button(here we use just a link):

<iframe id="frame1" style="display:none"></iframe> <a href="javascript:populateIframe('frame1','<?php echo $path; ?>')">download</a> 

The file 'download.php' (needs to be put on your server) simply contains:

<?php     header("Content-Type: application/octet-stream");    header("Content-Disposition: attachment; filename=".$_GET['path']);    readfile($_GET['path']); ?> 

So when you click the link, the hidden iframe then gets/opens the sourcefile 'download.php'. With the path as get parameter. We think this is the best solution!

It should be noted that the PHP part of this solution is a simple demonstration and potentially very, very insecure. It allows the user to download any file, not just a pre-defined set. That means they could download parts of the source code of the site itself, possibly containing API credentials etc.

like image 155
roulio Avatar answered Sep 22 '22 13:09

roulio


I have created an open source jQuery File Download plugin (Demo with examples) (GitHub) which could also help with your situation. It works pretty similarly with an iframe but has some cool features that I have found quite handy:

  • User never leaves the same page they initiated a file download from. This feature is becoming crucial for modern web applications
  • Tested cross browser support (including mobile!)
  • It supports POST and GET requests in a manner similar to jQuery's AJAX API
  • successCallback and failCallback functions allow for you to be explicit about what the user sees in either situation
  • In conjunction with jQuery UI a developer can easily show a modal telling the user that a file download is occurring, disband the modal after the download starts or even inform the user in a friendly manner that an error has occurred. See the Demo for an example of this.
like image 41
John Culviner Avatar answered Sep 22 '22 13:09

John Culviner