Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Anchor tag download attribute not working :Bug in Chrome 35.0.1916.114

I am trying to refer to this code where a we are downloading a CSV file on click of a link.

$(document).ready(function () {      function exportTableToCSV($table, filename) {          var $rows = $table.find('tr:has(td)'),              // Temporary delimiter characters unlikely to be typed by keyboard             // This is to avoid accidentally splitting the actual contents             tmpColDelim = String.fromCharCode(11), // vertical tab character             tmpRowDelim = String.fromCharCode(0), // null character              // actual delimiter characters for CSV format             colDelim = '","',             rowDelim = '"\r\n"',              // Grab text from table into CSV formatted string             csv = '"' + $rows.map(function (i, row) {                 var $row = $(row),                     $cols = $row.find('td');                  return $cols.map(function (j, col) {                     var $col = $(col),                         text = $col.text();                      return text.replace('"', '""'); // escape double quotes                  }).get().join(tmpColDelim);              }).get().join(tmpRowDelim)                 .split(tmpRowDelim).join(rowDelim)                 .split(tmpColDelim).join(colDelim) + '"',              // Data URI             csvData = 'data:application/csv;charset=utf-8,' + encodeURIComponent(csv);          $(this)             .attr({             'download': filename,                 'href': csvData,                 'target': '_blank'         });     }      // This must be a hyperlink     $(".export").on('click', function (event) {         // CSV         exportTableToCSV.apply(this, [$('#dvData>table'), 'export.csv']);          // IF CSV, don't do event.preventDefault() or return false         // We actually need this to be a typical hyperlink     }); }); 

But somehow, the downloaded file is named as download without extension in Chrome v35.0.1916.114 , one workaround was to change data:application/csv to data:text/csv, but that only helped in getting the extension correct in the downloaded file i.e. it now downloads as download.csv.

The issue with the download attribute still remains. I wanted to name my file as export.csv, but it still gives me download.csv.

like image 634
Sudo Avatar asked May 22 '14 19:05

Sudo


People also ask

Why download attribute is not working in Chrome?

The download attribute only works for same-originl URLs. So if the href is not the same origin as the site, it won't work. In other words, you can only download files that belongs to that website.

How do I download using anchor tag?

Approach 1: Using Download attribute The download attribute simply uses an anchor tag to prepare the location of the file that needs to be downloaded. The name of the file can be set using the attribute value name, if not provided then the original filename will be used.

What is download attribute in anchor tag?

The download attribute specifies that the target (the file specified in the href attribute) will be downloaded when a user clicks on the hyperlink. The optional value of the download attribute will be the new name of the file after it is downloaded.


1 Answers

So you should change this:

// Data URI csvData = 'data:application/csv;charset=utf-8,' + encodeURIComponent(csv);  $(this)     .attr({     'download': filename,         'href': csvData,         'target': '_blank' }); 

To This

// Data URI //csvData = 'data:text/csv;charset=utf-8,' + encodeURIComponent(csv), //old way blob = new Blob([csv], { type: 'text/csv' }); //new way var csvUrl = URL.createObjectURL(blob);  $(this) .attr({     'download': filename,     'href': csvUrl }); 

And it should work!

like image 78
matsilva Avatar answered Oct 14 '22 18:10

matsilva