According to caniuse the download
attribute of <a>
element is supported at Microsoft Edge build 10547+, but not IE or Safari.
How to download a file object without using <a>
element with download
attribute set or a server?
According to caniuse the download
attribute of <a>
element is supported at Microsoft Edge build 10547+, but not IE or Safari.
How to download a file object without using <a>
element with download
attribute set or a server?
There are a number of ways of triggering a download. Following are a few:
Use a form:
<form method="get" action="mydoc.doc">
<button type="submit">Download</button>
</form>
Use javascript:
<button type="submit" onclick="window.open('mydoc.doc')">Download</button>
window.open("blob:xyz")
still works well for me in 2023 here's the reference; developer.mozilla.org/en-US/docs/Web/API/Window/open –
Anklet Although I support @LeoFarmer's answer, I would like to offer two "hackable" approaches:
If the file is very small, you can use a
with the href='data:[<mediatype>][;base64],<data>'
.
This could allow you to add content disposition in the mediatype
, emulating an HTTP header. This hack is also not as portable as one might hope.
On small to medium files, it's possible to download the file using AJAX, and then use the Javascript File API to prompt for file saving (the API doesn't support saving, but it's easy to convert the data to a data URL).
If you want to avoid the Javascript File API, you can try emulating an anchor click, as suggested here.
Again, as pointed out by Leo Farmer, these solutions can't promise that the browser won't open the file in a new tab instead of saving it to the disk, but I think it's safe to say that all users will be able to gracefully degrade to a cmd+S
or ctrl+S
keyboard shortcut :-)
Use FileSaver.js
It supports all the commonly used browsers.
Just include:
<script type="text/javascript" src="FileSaver.min.js"></script>
and use it like:
var file = new File(["Hello, world!"], "hello world.txt", {type: "text/plain;charset=utf-8"});
saveAs(file);
Note: To make it work also in Safari < 6, Opera < 15 and FireFox < 20 you need to include Blob.js as a dependency.
File
constructor available at the browsers mentioned at last sentence of Answer? –
Chuvash You may do this using both download attribute and jquery. download attribute don't support in ie and safari/ios. So you may use jquery to do that
$('.download').click(function(e) {
e.preventDefault(); //stop the browser from following
window.location.href = 'uploads/file.doc';
});
<a href="no-script.html" class="download">Download</a>
You can use data URI
data:[<mediatype>][;base64],<data>
representation of file either created manually or utilizing FileReader()
, .readAsDataURL()
, with MIME
type set to application/octet-stream
, encodeURIComponent()
, window.open()
<script>
var file = "data:application/octet-stream,"
+ encodeURIComponent("<!DOCTYPE html>"
+ "<html><body>"
+ "<div>abc</div>"
+ "</body></html>");
var saveFile = window.open(file, "_self");
</script>
<script>
var blob = new Blob(["abc"], {type:"text/plain"});
var reader = new FileReader();
reader.addEventListener("load", function(e) {
// replace existing `MIME` type with `application/octet-stream`
var file = "data:application/octet-stream;"
+ e.target.result.split(/;/)[1];
var saveFile = window.open(file, "_self");
});
reader.readAsDataURL(blob)
</script>
If you're using server-side then follow the form submission mechanism to render the page. In MVC we can use below code
@using (Html.BeginForm("GetAttachment", "User", FormMethod.Post))
{
<button type="submit">Download</button>
}
public ActionResult GetAttachment()
{
string filename = "File.pdf";
string filepath = AppDomain.CurrentDomain.BaseDirectory + "/Path/To/File/" + filename;
byte[] filedata = System.IO.File.ReadAllBytes(filepath);
string contentType = MimeMapping.GetMimeMapping(filepath);
var cd = new System.Net.Mime.ContentDisposition
{
FileName = filename,
Inline = true,
};
Response.AppendHeader("Content-Disposition", cd.ToString());
return File(filedata, contentType);
}
<a>
element with download attribute or a server?" –
Chuvash <form>
does not need to be submitted to a server. The requirement of Question is to not use a server –
Chuvash © 2022 - 2024 — McMap. All rights reserved.
.responseType
was not defined at that point in browser development. – ChuvashContent-Disposition
header. Using the browser to offer the download – Chuvash