Window.locationから強制的にダウンロードするときに、JavaScriptでBLOBファイルの名前をどのように設定しますか?
function newFile(data) {
var json = JSON.stringify(data);
var blob = new Blob([json], {type: "octet/stream"});
var url = window.URL.createObjectURL(blob);
window.location.assign(url);
}
上記のコードを実行すると、ページを更新することなくファイルを即座にダウンロードします。
bfefe410-8d9c-4883-86c5-d76c50a24a1d
代わりに、ファイル名をmy-download.jsonに設定します。
私が知っている唯一の方法は FileSaver.js によって使用されるトリックです:
<a>
タグを作成します。href
属性をBLOBのURLに設定します。download
属性をファイル名に設定します。<a>
タグをクリックしてください。これは簡単な例です( jsfiddle ):
var saveData = (function () {
var a = document.createElement("a");
document.body.appendChild(a);
a.style = "display: none";
return function (data, fileName) {
var json = JSON.stringify(data),
blob = new Blob([json], {type: "octet/stream"}),
url = window.URL.createObjectURL(blob);
a.href = url;
a.download = fileName;
a.click();
window.URL.revokeObjectURL(url);
};
}());
var data = { x: 42, s: "hello, world", d: new Date() },
fileName = "my-download.json";
saveData(data, fileName);
この例は、アイデアを説明するためだけに作成したものです。プロダクションコードでは代わりにFileSaver.jsを使用してください。
注意事項
私はちょうどInternet Explorer(とにかく最近のバージョン)のサポートで受け入れられた答えを広げて、そしてjQueryを使用してコードを片付けたいと思いました:
$(document).ready(function() {
saveFile("Example.txt", "data:attachment/text", "Hello, world.");
});
function saveFile (name, type, data) {
if (data !== null && navigator.msSaveBlob)
return navigator.msSaveBlob(new Blob([data], { type: type }), name);
var a = $("<a style='display: none;'/>");
var url = window.URL.createObjectURL(new Blob([data], {type: type}));
a.attr("href", url);
a.attr("download", name);
$("body").append(a);
a[0].click();
window.URL.revokeObjectURL(url);
a.remove();
}
これはフィドルの例です 。 ゴッドスピード。
上記の解決策と同じ原則。しかし、私は大きなファイル(> 40 MB)がランダムな位置で切り捨てられるFirefox 52.0(32ビット)に問題がありました。 revokeObjectUrl()の呼び出しを再スケジュールすると、この問題は解決します。
function saveFile(blob, filename) {
if (window.navigator.msSaveOrOpenBlob) {
window.navigator.msSaveOrOpenBlob(blob, filename);
} else {
const a = document.createElement('a');
document.body.appendChild(a);
const url = window.URL.createObjectURL(blob);
a.href = url;
a.download = filename;
a.click();
setTimeout(() => {
window.URL.revokeObjectURL(url);
document.body.removeChild(a);
}, 0)
}
}
最近、私は同じ問題を抱えていたように。私は自分の解決策を追加します。
function newFile(data, fileName) {
var json = JSON.stringify(data);
//IE11 support
if (window.navigator && window.navigator.msSaveOrOpenBlob) {
let blob = new Blob([json], {type: "application/json"});
window.navigator.msSaveOrOpenBlob(blob, fileName);
} else {// other browsers
let file = new File([json], fileName, {type: "application/json"});
let exportUrl = URL.createObjectURL(file);
window.location.assign(exportUrl);
URL.revokeObjectURL(exportUrl);
}
}
saveFileOnUserDevice = function(file){ // content: blob, name: string
if(navigator.msSaveBlob){ // For ie and Edge
return navigator.msSaveBlob(file.content, file.name);
}
else{
let link = document.createElement('a');
link.href = window.URL.createObjectURL(file.content);
link.download = file.name;
document.body.appendChild(link);
link.dispatchEvent(new MouseEvent('click', {bubbles: true, cancelable: true, view: window}));
link.remove();
window.URL.revokeObjectURL(link.href);
}
}