ページから移動せずにダウンロードウィンドウを開く最も簡単な方法


118

現在のページから移動したり、Internet Explorer(IEでうまく機能しないポップアップを開いたりせずに、ヘッダーにcontent-disposion:attachmentを設定できると仮定します)を開くための最良のクロスブラウザーの方法は何ですか? )6。

回答:


106

7年が経過し、IE6で動作するかどうかはわかりませんが、FFとChromeでOpenFileDialogが表示されます。

var file_path = 'host/path/file.ext';
var a = document.createElement('A');
a.href = file_path;
a.download = file_path.substr(file_path.lastIndexOf('/') + 1);
document.body.appendChild(a);
a.click();
document.body.removeChild(a);

最初にこの解決策に感謝しますが、removeChild(a)zipがzipを解凍するとエラーが発生する場合にバグを見つけたので、このコードを削除して解決します
Roy

2
@Manoj Rana-FF 58.0.2(64ビット)で動作することを確認しました。2行document.body.appendChild(a); を削除すると、FFでは機能しませんdocument.body.removeChild(a);
0x000f 2018年

1
Edge 16で機能させるには、ファイルの送信元のヘッダーにContent-Type: application/octet-streamおよびが含まれてContent-Disposition: attachmentいる必要があります。
Simon


2
@ user1933131 chromeはクロスオリジンのみを削除します
Brandy23

200

このjavascriptは、新しいウィンドウやタブを開かないという点で優れています。

window.location.assign(url);

17
これはwindow.location = urlと同じです。「新しい値が場所のオブジェクトに割り当てられているときはいつでも、文書は(window.location.assignかのようなURLを使用してロードされます)に変更URLと呼ばれていた」 - developer.mozilla.org/en-US/docs/ Web / API / window.location
Rob Juurlink 2013

13
これにより、WebSocket接続が切断されます。
igorpavlov

4
私は同じソリューションを使用しましたが、ダウンロードダイアログを開くのではなく、同じタブでファイルを開きます。
テクノクラッカー2016

2
URLがダウンロードページの場合、window.open(url、 '_self')と同じです。
エキスパートは2016

5
IE11を使用していると、JSが停止することがわかりました。IE 11では、別のタブを開くwindow.open(url、 '_blank')を使用しましたが、ファイルがダウンロードされたときにそのタブは閉じられました。これにより、JSが実行され続けました。
ルーク

23

私は常にtarget = "_ blank"をダウンロードリンクに追加します。これにより新しいウィンドウが開きますが、ユーザーが[保存]をクリックするとすぐに、新しいウィンドウが閉じます。


2
これが最良の答えです。Internet Explorerでは、ダウンロードするリンクに「target = "_ blank」を追加すると、ブラウザーがナビゲートできなくなり(「HTML1300:ナビゲーションが発生しました」が印刷されます)、ページが不整合な状態になる可能性があります。
user64141 2017

23

これをHTMLのヘッドセクションに配置し、urlvarをダウンロードするファイルのURLに設定します。

<script type="text/javascript">  
function startDownload()  
{  
     var url='http://server/folder/file.ext';    
     window.open(url, 'Download');  
}  
</script>

次に、これを本文に挿入すると、5秒後に自動的にダウンロードが開始されます。

<script type="text/javascript">  
setTimeout('startDownload()', 5000); //starts download after 5 seconds  
</script> 

ここから。)


2
IE6では、ユーザーが[保存]をクリックするとファイルは保存されますが、ポップアップは開いたままなので、これは機能しません。これは受け入れられません。
mkoryak 2009年

このコードはSafariで機能していません。Safariで解決するのを手伝ってください。
Khuntを2015

17

私は質問を依頼された知っている7 years and 9 months agoが、多くのポストされたソリューションは、使用して、たとえば、動作していないよう<iframe>でのみ動作FireFoxし、動作しませんChrome

最適なソリューション:

他の回答に記載されているように、にリンク要素を追加する必要がないリンク要素を使用することで、ファイルダウンロードポップアップを開くのに最適なソリューションです。JavaScriptHTMLdocument.body

次の関数を使用できます。

function downloadFile(filePath){
    var link=document.createElement('a');
    link.href = filePath;
    link.download = filePath.substr(filePath.lastIndexOf('/') + 1);
    link.click();
}

私のアプリケーションでは、次のように使用しています。

downloadFile('report/xls/myCustomReport.xlsx');

作業デモ:

注意:

  • link.downloadブラウザがファイルを新しいタブで開かず、ダウンロードポップアップを起動しないように、属性を使用する必要があります。
  • これは、いくつかのファイルタイプ(docx、xlsx、png、pdfなど)でテストされています。

ファイルがダウンロードされるまで、ロードGIFを表示する最良の方法は何ですか?
Ctrl_Alt_Defeat 2017年

1
@Ctrl_Alt_Defeatさて、このケースでは、ダウンロードプロセスを追跡するのは容易ではありませんが、1つのトリックは、上のこのGIFアニメーション表示するようにすることができlink、このコードを使用して、クリックするとタイムアウト後にそれを隠す:link.onclick = function() { document.body.innerText = "The file is being downloaded ..."; setTimeout(function() { document.body.innerText = ""; }, 2000); }、あなたはそれが働いて見ることができます、このフィドルですが、推奨される方法ではないことに注意してくださいAjax
cнŝdk

1
Firefoxでは機能しません。Firefoxでダウンロードする方法
Manoj Rana

@ManojRana Firefoxの場合は、この回答をiframe参照してください。
cнŝdk

2
このソリューションは、Chrome、Safari、Firefoxで機能します:)
ariebear

15

この質問が示唆するように、私はjavascriptを使用してファイルのダウンロードを開始する良い方法を探していました。ただし、これらの回答は役に立ちませんでした。次に、いくつかのxbrowserテストを行ったところ、i> 8のすべての最新ブラウザーでiframeが最適に機能することがわかりました。

downloadUrl = "http://example.com/download/file.zip";
var downloadFrame = document.createElement("iframe"); 
downloadFrame.setAttribute('src',downloadUrl);
downloadFrame.setAttribute('class',"screenReaderText"); 
document.body.appendChild(downloadFrame); 

class="screenReaderText" 存在するが表示できないコンテンツをスタイルするための私のクラスです。

css:

.screenReaderText { 
  border: 0; 
  clip: rect(0 0 0 0); 
  height: 1px; 
  margin: -1px; 
  overflow: hidden; 
  padding: 0; 
  position: absolute; 
  width: 1px; 
}

html5boilerplateの.visuallyHiddenと同じ

リンクが壊れている場合、iframeメソッドはファイルを開くことができなかったという空白のページにリダイレクトするのではなく、何もしないので、私はこれをjavascript window.openメソッドよりも好みます。

window.open(downloadUrl, 'download_window', 'toolbar=0,location=no,directories=0,status=0,scrollbars=0,resizeable=0,width=1,height=1,top=0,left=0');
window.focus();

6

HTML5 Blob Object-URL File APIの使用:

/**
 * Save a text as file using HTML <a> temporary element and Blob
 * @see /programming/49988202/macos-webview-download-a-html5-blob-file
 * @param fileName String
 * @param fileContents String JSON String
 * @author Loreto Parisi
*/
var saveBlobAsFile = function(fileName,fileContents) {
    if(typeof(Blob)!='undefined') { // using Blob
        var textFileAsBlob = new Blob([fileContents], { type: 'text/plain' });
        var downloadLink = document.createElement("a");
        downloadLink.download = fileName;
        if (window.webkitURL != null) {
            downloadLink.href = window.webkitURL.createObjectURL(textFileAsBlob);
        }
        else {
            downloadLink.href = window.URL.createObjectURL(textFileAsBlob);
            downloadLink.onclick = document.body.removeChild(event.target);
            downloadLink.style.display = "none";
            document.body.appendChild(downloadLink);
        }
        downloadLink.click();
    } else {
        var pp = document.createElement('a');
        pp.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(fileContents));
        pp.setAttribute('download', fileName);
        pp.onclick = document.body.removeChild(event.target);
        pp.click();
    }
}//saveBlobAsFile

/**
 * Save a text as file using HTML <a> temporary element and Blob
 * @see /programming/49988202/macos-webview-download-a-html5-blob-file
 * @param fileName String
 * @param fileContents String JSON String
 * @author Loreto Parisi
 */
var saveBlobAsFile = function(fileName, fileContents) {
  if (typeof(Blob) != 'undefined') { // using Blob
    var textFileAsBlob = new Blob([fileContents], {
      type: 'text/plain'
    });
    var downloadLink = document.createElement("a");
    downloadLink.download = fileName;
    if (window.webkitURL != null) {
      downloadLink.href = window.webkitURL.createObjectURL(textFileAsBlob);
    } else {
      downloadLink.href = window.URL.createObjectURL(textFileAsBlob);
      downloadLink.onclick = document.body.removeChild(event.target);
      downloadLink.style.display = "none";
      document.body.appendChild(downloadLink);
    }
    downloadLink.click();
  } else {
    var pp = document.createElement('a');
    pp.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(fileContents));
    pp.setAttribute('download', fileName);
    pp.onclick = document.body.removeChild(event.target);
    pp.click();
  }
} //saveBlobAsFile

var jsonObject = {
  "name": "John",
  "age": 31,
  "city": "New York"
};
var fileContents = JSON.stringify(jsonObject, null, 2);
var fileName = "data.json";

saveBlobAsFile(fileName, fileContents)


2
これが一番いい方法だと思います!!
Kushal MK

1
URL.revokeObjectURL(url)メモリを解放するためにファイルが不要になったときにを呼び出すこともお
勧め

5

ウィンドウの場所を変更すると、特にwebsocketなどの永続的な接続がある場合に問題が発生する可能性があります。したがって、私は常に古き良きiframeソリューションに頼っています。

HTML

<input type="button" onclick="downloadButtonClicked()" value="Download"/>
...
...
...
<iframe style="display:none;" name="hiddenIframe" id="hiddenIframe"></iframe>

JavaScript

function downloadButtonClicked() {
    // Simulate a link click
    var url = 'your_download_url_here';
    var elem = document.createElement('a');
    elem.href = url;
    elem.target = 'hiddenIframe';
    elem.click();
}

5

リンクが有効なファイルURLへのリンクである場合は、単純にwindow.location.hrefを割り当てるだけで機能します。

ただし、リンクが無効になり、iFrameが必要になる場合があります。

通常のevent.preventDefaultを実行して、ウィンドウが開かないようにします。jQueryを使用している場合、これは機能します。

$('<iframe>').attr('src', downloadThing.attr('href')).appendTo('body').on("load", function() {
   $(this).remove();
});

2

何時間も試した後、関数が生まれました:)ファイルのダウンロードの準備中にローダーを時間内に表示しなければならないシナリオがありました。

Chrome、Safari、Firefoxでの作業

function ajaxDownload(url, filename = 'file', method = 'get', data = {}, callbackSuccess = () => {}, callbackFail = () => {}) {
    $.ajax({
        url: url,
        method: 'GET',
        xhrFields: {
            responseType: 'blob'
        },
        success: function (data) {
            // create link element
            let a = document.createElement('a'), 
                url = window.URL.createObjectURL(data);

            // initialize 
            a.href = url;
            a.download = filename;

            // append element to the body, 
            // a must, due to Firefox
            document.body.appendChild(a);

            // trigger download
            a.click();

            // delay a bit deletion of the element
            setTimeout(function(){
                window.URL.revokeObjectURL(url);
                document.body.removeChild(a);
            }, 100);

            // invoke callback if any 
            callbackSuccess(data);
        },
        error: function (err) {
            // invoke fail callback if any
            callbackFail(err)
        }
    });

0

どうですか:

<meta http-equiv="refresh" content="5;url=http://site.com/file.ext">

この方法はすべてのブラウザーで(私は思う)機能し、「ダウンロードが5秒以内に開始されない場合は、ここをクリックしてください。」などのメッセージを入力できます。

あなたはそれがjavascriptである必要がある場合..まあ...

document.write('<meta http-equiv="refresh" content="5;url=http://site.com/file.ext">');

よろしく


0

小さな/隠されたiframeはこの目的のために働くことができます。

そうすれば、ポップアップを閉じることを心配する必要はありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.