file-saver
Advanced tools
Comparing version 1.2.2 to 1.3.0
{ | ||
"name": "file-saver", | ||
"main": "FileSaver.js", | ||
"version": "1.2.2", | ||
"version": "1.3.0", | ||
"homepage": "https://github.com/eligrey/FileSaver.js", | ||
@@ -18,5 +18,5 @@ "authors": [ | ||
"*", | ||
"!FileSaver.js", | ||
"!FileSaver.*js", | ||
"!LICENSE.md" | ||
] | ||
} |
135
FileSaver.js
/* FileSaver.js | ||
* A saveAs() FileSaver implementation. | ||
* 1.2.2 | ||
* 1.3.0 | ||
* | ||
@@ -18,3 +18,3 @@ * By Eli Grey, http://eligrey.com | ||
// IE <10 is explicitly unsupported | ||
if (typeof navigator !== "undefined" && /MSIE [1-9]\./.test(navigator.userAgent)) { | ||
if (typeof view === "undefined" || typeof navigator !== "undefined" && /MSIE [1-9]\./.test(navigator.userAgent)) { | ||
return; | ||
@@ -34,5 +34,3 @@ } | ||
} | ||
, is_safari = /Version\/[\d\.]+.*Safari/.test(navigator.userAgent) | ||
, webkit_req_fs = view.webkitRequestFileSystem | ||
, req_fs = view.requestFileSystem || webkit_req_fs || view.mozRequestFileSystem | ||
, is_safari = /constructor/i.test(view.HTMLElement) | ||
, throw_outside = function(ex) { | ||
@@ -44,3 +42,2 @@ (view.setImmediate || view.setTimeout)(function() { | ||
, force_saveable_type = "application/octet-stream" | ||
, fs_min_size = 0 | ||
// the Blob API is fundamentally broken as there is no "downloadfinished" event to subscribe to | ||
@@ -56,18 +53,2 @@ , arbitrary_revoke_timeout = 1000 * 40 // in ms | ||
}; | ||
/* // Take note W3C: | ||
var | ||
uri = typeof file === "string" ? file : file.toURL() | ||
, revoker = function(evt) { | ||
// idealy DownloadFinishedEvent.data would be the URL requested | ||
if (evt.data === uri) { | ||
if (typeof file === "string") { // file is an object URL | ||
get_URL().revokeObjectURL(file); | ||
} else { // file is a File | ||
file.remove(); | ||
} | ||
} | ||
} | ||
; | ||
view.addEventListener("downloadfinished", revoker); | ||
*/ | ||
setTimeout(revoker, arbitrary_revoke_timeout); | ||
@@ -105,5 +86,4 @@ } | ||
, type = blob.type | ||
, blob_changed = false | ||
, force = type === force_saveable_type | ||
, object_url | ||
, target_view | ||
, dispatch_all = function() { | ||
@@ -114,3 +94,3 @@ dispatch(filesaver, "writestart progress write writeend".split(" ")); | ||
, fs_error = function() { | ||
if (target_view && is_safari && typeof FileReader !== "undefined") { | ||
if (force && is_safari && view.FileReader) { | ||
// Safari doesn't allow downloading of blob urls | ||
@@ -120,3 +100,3 @@ var reader = new FileReader(); | ||
var base64Data = reader.result; | ||
target_view.location.href = "data:attachment/file" + base64Data.slice(base64Data.search(/[,;]/)); | ||
view.location.href = "data:attachment/file" + base64Data.slice(base64Data.search(/[,;]/)); | ||
filesaver.readyState = filesaver.DONE; | ||
@@ -130,10 +110,10 @@ dispatch_all(); | ||
// don't create more object URLs than needed | ||
if (blob_changed || !object_url) { | ||
if (!object_url) { | ||
object_url = get_URL().createObjectURL(blob); | ||
} | ||
if (target_view) { | ||
target_view.location.href = object_url; | ||
if (force) { | ||
view.location.href = object_url; | ||
} else { | ||
var new_tab = view.open(object_url, "_blank"); | ||
if (new_tab === undefined && is_safari) { | ||
var opened = view.open(object_url, "_blank"); | ||
if (!opened) { | ||
// Apple does not allow window.open, see https://developer.apple.com/library/safari/documentation/Tools/Conceptual/SafariExtensionGuide/WorkingwithWindowsandTabs/WorkingwithWindowsandTabs.html | ||
@@ -147,16 +127,5 @@ view.location.href = object_url; | ||
} | ||
, abortable = function(func) { | ||
return function() { | ||
if (filesaver.readyState !== filesaver.DONE) { | ||
return func.apply(this, arguments); | ||
} | ||
}; | ||
} | ||
, create_if_not_found = {create: true, exclusive: false} | ||
, slice | ||
; | ||
filesaver.readyState = filesaver.INIT; | ||
if (!name) { | ||
name = "download"; | ||
} | ||
if (can_use_save_link) { | ||
@@ -174,72 +143,8 @@ object_url = get_URL().createObjectURL(blob); | ||
} | ||
// Object and web filesystem URLs have a problem saving in Google Chrome when | ||
// viewed in a tab, so I force save with application/octet-stream | ||
// http://code.google.com/p/chromium/issues/detail?id=91158 | ||
// Update: Google errantly closed 91158, I submitted it again: | ||
// https://code.google.com/p/chromium/issues/detail?id=389642 | ||
if (view.chrome && type && type !== force_saveable_type) { | ||
slice = blob.slice || blob.webkitSlice; | ||
blob = slice.call(blob, 0, blob.size, force_saveable_type); | ||
blob_changed = true; | ||
} | ||
// Since I can't be sure that the guessed media type will trigger a download | ||
// in WebKit, I append .download to the filename. | ||
// https://bugs.webkit.org/show_bug.cgi?id=65440 | ||
if (webkit_req_fs && name !== "download") { | ||
name += ".download"; | ||
} | ||
if (type === force_saveable_type || webkit_req_fs) { | ||
target_view = view; | ||
} | ||
if (!req_fs) { | ||
fs_error(); | ||
return; | ||
} | ||
fs_min_size += blob.size; | ||
req_fs(view.TEMPORARY, fs_min_size, abortable(function(fs) { | ||
fs.root.getDirectory("saved", create_if_not_found, abortable(function(dir) { | ||
var save = function() { | ||
dir.getFile(name, create_if_not_found, abortable(function(file) { | ||
file.createWriter(abortable(function(writer) { | ||
writer.onwriteend = function(event) { | ||
target_view.location.href = file.toURL(); | ||
filesaver.readyState = filesaver.DONE; | ||
dispatch(filesaver, "writeend", event); | ||
revoke(file); | ||
}; | ||
writer.onerror = function() { | ||
var error = writer.error; | ||
if (error.code !== error.ABORT_ERR) { | ||
fs_error(); | ||
} | ||
}; | ||
"writestart progress write abort".split(" ").forEach(function(event) { | ||
writer["on" + event] = filesaver["on" + event]; | ||
}); | ||
writer.write(blob); | ||
filesaver.abort = function() { | ||
writer.abort(); | ||
filesaver.readyState = filesaver.DONE; | ||
}; | ||
filesaver.readyState = filesaver.WRITING; | ||
}), fs_error); | ||
}), fs_error); | ||
}; | ||
dir.getFile(name, {create: false}, abortable(function(file) { | ||
// delete file if it already exists | ||
file.remove(); | ||
save(); | ||
}), abortable(function(ex) { | ||
if (ex.code === ex.NOT_FOUND_ERR) { | ||
save(); | ||
} else { | ||
fs_error(); | ||
} | ||
})); | ||
}), fs_error); | ||
}), fs_error); | ||
fs_error(); | ||
} | ||
, FS_proto = FileSaver.prototype | ||
, saveAs = function(blob, name, no_auto_bom) { | ||
return new FileSaver(blob, name, no_auto_bom); | ||
return new FileSaver(blob, name || blob.name || "download", no_auto_bom); | ||
} | ||
@@ -250,14 +155,12 @@ ; | ||
return function(blob, name, no_auto_bom) { | ||
name = name || blob.name || "download"; | ||
if (!no_auto_bom) { | ||
blob = auto_bom(blob); | ||
} | ||
return navigator.msSaveOrOpenBlob(blob, name || "download"); | ||
return navigator.msSaveOrOpenBlob(blob, name); | ||
}; | ||
} | ||
FS_proto.abort = function() { | ||
var filesaver = this; | ||
filesaver.readyState = filesaver.DONE; | ||
dispatch(filesaver, "abort"); | ||
}; | ||
FS_proto.abort = function(){}; | ||
FS_proto.readyState = FS_proto.INIT = 0; | ||
@@ -264,0 +167,0 @@ FS_proto.WRITING = 1; |
{ | ||
"name": "file-saver", | ||
"version": "1.2.2", | ||
"version": "1.3.0", | ||
"description": "An HTML5 saveAs() FileSaver implementation", | ||
@@ -5,0 +5,0 @@ "main": "FileSaver.js", |
@@ -57,3 +57,3 @@ FileSaver.js | ||
```js | ||
FileSaver saveAs(Blob data, DOMString filename, optional Boolean disableAutoBOM) | ||
FileSaver saveAs(Blob/File data, optional DOMString filename, optional Boolean disableAutoBOM) | ||
``` | ||
@@ -86,2 +86,14 @@ | ||
### Saving File | ||
You can save a File constructor without specifying a filename. The | ||
File itself already contains a name, There is a hand full of ways to get a file | ||
instance (from storage, file input, new constructor) | ||
But if you still want to change the name, then you can change it in the 2nd argument | ||
```js | ||
var file = new File(["Hello, world!"], "hello world.txt", {type: "text/plain;charset=utf-8"}); | ||
saveAs(file); | ||
``` | ||
Note: The standard HTML5 `canvas.toBlob()` method is not available in all browsers. | ||
@@ -88,0 +100,0 @@ [canvas-toBlob.js][6] is a cross-browser `canvas.toBlob()` that polyfills this. |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
130
29036
446