私は、ブラウザから誰でもアクセスできる完全にJavaScriptベースのZip/unzipユーティリティを作成するというアイデアで遊んでいます。 Zipファイルをブラウザに直接ドラッグするだけで、すべてのファイルをダウンロードできます。また、個々のファイルをドラッグして新しいZipファイルを作成することもできます。
サーバーサイドで行う方が良いと思いますが、このプロジェクトはちょっとした楽しみのためです。
使用可能なさまざまな方法を利用すれば、ファイルをブラウザーにドラッグするのは簡単です。 (Gmailスタイル)
エンコード/デコードはうまくいけばうまくいきます。私はいくつかのas3 Zipライブラリを見てきましたので、私はそれで問題ないはずです。
私の問題は、最後にファイルをダウンロードすることです。
window.location = 'data:jpg/image;base64,/9j/4AAQSkZJR....'
これは、Firefoxでは正常に機能しますが、クロムでは機能しません。
<img src="data:jpg/image;ba.." />
を使用して、chromeにある画像としてファイルを埋め込むことができますが、ファイルは必ずしも画像ではありません。任意の形式を使用できます。
誰でも別の解決策や何らかの回避策を考えることができますか?
アイデア:
<a href="data:...." target="_blank">
を試してください(未テスト)
データURLの代わりに downloadify を使用します(IEでも機能します)
(デフォルトの「ダウンロード」の代わりに)ファイルに推奨名を付けたい場合は、Chrome、Firefox、およびいくつかのIEバージョンで以下を使用できます。
function downloadURI(uri, name) {
var link = document.createElement("a");
link.download = name;
link.href = uri;
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
delete link;
}
そして、次の例はその使用を示しています。
downloadURI("data:text/html,HelloWorld!", "helloWorld.txt");
私の経験を共有し、Firefoxで動作しないダウンロードに固執し、2014年の回答を更新したい人を助けたいです。以下のスニペットは、Firefoxとchromeの両方で動作し、ファイル名を受け入れます。
// Construct the <a> element
var link = document.createElement("a");
link.download = thefilename;
// Construct the uri
var uri = 'data:text/csv;charset=utf-8;base64,' + someb64data
link.href = uri;
document.body.appendChild(link);
link.click();
// Cleanup the DOM
document.body.removeChild(link);
function download(dataurl, filename) {
var a = document.createElement("a");
a.href = dataurl;
a.setAttribute("download", filename);
a.click();
return false;
}
download("data:text/html,HelloWorld!", "helloWorld.txt");
または:
function download(url, filename) {
fetch(url).then(function(t) {
return t.blob().then((b)=>{
var a = document.createElement("a");
a.href = URL.createObjectURL(b);
a.setAttribute("download", filename);
a.click();
}
);
});
}
download("https://get.geojs.io/v1/ip/geo.json","geoip.json")
download("data:text/html,HelloWorld!", "helloWorld.txt");
いくつかの解決策がありますが、それらはHTML5に依存しており、一部のブラウザにはまだ完全には実装されていません。以下の例は、ChromeおよびFirefox(一部は動作します)でテストされました。
document.location.href
をデータURIに設定するだけです。<a href="your-data-uri" download="filename.txt">
を使用してファイル名を指定します。以下は、FirefoxとChromeで動作するがInternet Explorerでは動作しない、私がテストした純粋なJavaScriptソリューションです。
function downloadDataUrlFromJavascript(filename, dataUrl) {
// Construct the 'a' element
var link = document.createElement("a");
link.download = filename;
link.target = "_blank";
// Construct the URI
link.href = dataUrl;
document.body.appendChild(link);
link.click();
// Cleanup the DOM
document.body.removeChild(link);
delete link;
}
これまで見つかったクロスブラウザソリューション:
downloadify-> Flashが必要
databounce-> IE 10および11でテストされており、動作しません。サーブレットといくつかのカスタマイズが必要です。 (ナビゲーターを誤って検出する。互換モードでIEをテストに設定し、サーブレットのデフォルトの文字セット、絶対パスの正しいサーブレットパスを持つJavaScriptオプションオブジェクトを設定する必要があった...)同じウィンドウ内のファイル。
download.js-> http://danml.com/download.html 同様の別のライブラリですが、テストされていません。サーブレットやFlashを必要としない純粋なJavaScriptであると主張しますが、IE <= 9では機能しません。
@owencmと@ Chazt3nからの回答を組み合わせることで、この関数はIE11、Firefox、Chromeからテキストをダウンロードできます。 (申し訳ありませんが、SafariやOperaにはアクセスできませんが、試してみて動作する場合はコメントを追加してください。)
initiate_user_download = function(file_name, mime_type, text) {
// Anything but IE works here
if (undefined === window.navigator.msSaveOrOpenBlob) {
var e = document.createElement('a');
var href = 'data:' + mime_type + ';charset=utf-8,' + encodeURIComponent(text);
e.setAttribute('href', href);
e.setAttribute('download', file_name);
document.body.appendChild(e);
e.click();
document.body.removeChild(e);
}
// IE-specific code
else {
var charCodeArr = new Array(text.length);
for (var i = 0; i < text.length; ++i) {
var charCode = text.charCodeAt(i);
charCodeArr[i] = charCode;
}
var blob = new Blob([new Uint8Array(charCodeArr)], {type: mime_type});
window.navigator.msSaveOrOpenBlob(blob, file_name);
}
}
// Example:
initiate_user_download('data.csv', 'text/csv', 'Sample,Data,Here\n1,2,3\n');
JavaScriptを介してデータURLのダウンロードを開始することもできます。このような解決策については、 https://stackoverflow.com/a/13696029/271577 を参照してください(テキストリンクの例と共に)。
IEに問題がある場合:
Yettiの回答をここに追加してください: IEでキャンバスをローカルに保存する
dataURItoBlob = function(dataURI) {
var binary = atob(dataURI.split(',')[1]);
var array = [];
for(var i = 0; i < binary.length; i++) {
array.Push(binary.charCodeAt(i));
}
return new Blob([new Uint8Array(array)], {type: 'image/png'});
}
var blob = dataURItoBlob(uri);
window.navigator.msSaveOrOpenBlob(blob, "my-image.png");
引用 this answer:
ファイルをダウンロードし、base64としてユーザーに提供します(CORSの問題を回避するため)
$.get(/*...*/,function (result)
{
var blob=new Blob([result]);
var link=document.createElement('a');
link.href=window.URL.createObjectURL(blob);
link.download="myFileName.txt";
link.click();
});
これは、IE 10 +、Chrome 8 +、FF 4+です。 https://developer.mozilla.org/en-US/docs/Web/API/URL.createObjectURL を参照してください
Chrome、Firefox、Operaでのみファイルをダウンロードします。これは、アンカータグのダウンロード属性を使用して、ブラウザに強制的にダウンロードさせます。
あなたの問題は本質的に「すべてのブラウザがこれをサポートするわけではない」に要約されます。
回避策を試して、Flashオブジェクトから解凍されたファイルを提供することはできますが、JSのみの純度を失うことになります(とにかく、何らかのFlash回避策なしで現在「ブラウザにファイルをドラッグ」できるかどうかわかりません-それは多分HTML5機能ですか?)