Cara termudah untuk membuka jendela unduhan tanpa keluar dari halaman

119

Apa cara terbaik lintas browser untuk membuka dialog unduhan (anggap saja kita dapat menyetel disposisi konten: lampiran di tajuk) tanpa keluar dari laman saat ini, atau membuka munculan, yang tidak berfungsi dengan baik di Internet Explorer (IE ) 6.

mkoryak
sumber

Jawaban:

106

7 tahun telah berlalu dan saya tidak tahu apakah ini berfungsi untuk IE6 atau tidak, tetapi ini meminta OpenFileDialog di FF dan Chrome.

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);
0x000f
sumber
Pertama, terima kasih untuk solusi ini, tetapi saya menemukan bug jika removeChild (a) zip akan mengekstrak kesalahan dengan zip rusak, jadi hapus kode ini untuk mengatasinya
Roy
2
@Manoj Rana - Saya telah memeriksa FF 58.0.2 (64-bit) itu berfungsi. Ini tidak akan bekerja pada FF manapun jika Anda menghapus 2 baris document.body.appendChild (a); document.body.removeChild (a);
0x000f
1
Untuk membuatnya berfungsi di Edge 16, header, dari mana file itu berasal, harus berisi Content-Type: application/octet-streamdan Content-Disposition: attachment.
Simon
12
ini tidak berfungsi lagi developers.google.com/web/updates/2018/02/…
Paulius Dragunas
2
@ user1933131 chrome menghapus hanya untuk lintas sumber
Brandy23
202

Javascript ini bagus karena tidak membuka jendela atau tab baru.

window.location.assign(url);
mozgras.dll
sumber
18
Ini sama dengan window.location = url; “Setiap kali nilai baru ditetapkan ke objek lokasi, dokumen akan dimuat menggunakan URL seolah-olah window.location.assign () telah dipanggil dengan URL yang dimodifikasi" - developer.mozilla.org/en-US/docs/ Web / API / window.location
Rob Juurlink
13
Hal ini menyebabkan koneksi WebSocket terputus.
igorpavlov
4
Saya telah menggunakan solusi yang sama tetapi membuka file di tab yang sama alih-alih membuka dialog unduhan.
Techno Cracker
2
Itu sama dengan window.open (url, '_self') jika url untuk halaman download maka.
Pakar ingin
5
Saat menggunakan IE11 saya menemukan bahwa ini menyebabkan JS berhenti. Jadi untuk IE 11 saya menggunakan window.open (url, '_blank') yang membuka tab lain, tetapi tab itu ditutup ketika berhasil, file itu adalah unduhan. Ini membuat JS tetap berjalan.
Lukas
23

Saya selalu menambahkan target = "_ blank" ke tautan unduhan. Ini akan membuka jendela baru, tetapi segera setelah pengguna mengklik simpan, jendela baru ditutup.

jao
sumber
2
Ini jawaban terbaik. Di Internet Explorer, menambahkan 'target = "_ blank"' ke tautan yang akan diunduh akan menghentikan peramban dari menavigasi keluar (di mana "HTML1300: Navigasi terjadi" dicetak), dan dengan demikian dapat membuat laman dalam keadaan tidak konsisten.
pengguna64141
23

Letakkan ini di bagian head HTML, atur urlvar ke URL file yang akan diunduh:

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

Kemudian masukkan ini ke dalam body, yang akan memulai pengunduhan secara otomatis setelah 5 detik:

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

(Dari sini .)

George Claghorn
sumber
2
Itu tidak berfungsi, karena di IE6, jika pengguna mengklik "simpan", file tersebut disimpan, tetapi popup tetap terbuka. Ini tidak bisa di terima.
mkoryak
kode ini tidak berfungsi di safari, bisakah Anda membantu saya menyelesaikannya di safari?
Renish Khunt
17

Saya tahu pertanyaan itu telah diajukan 7 years and 9 months agotetapi banyak solusi yang diposting tampaknya tidak berfungsi, misalnya menggunakan <iframe>karya hanya dengan FireFoxdan tidak berfungsi Chrome.

Solusi terbaik:

Solusi kerja terbaik untuk membuka pop-up unduhan file JavaScriptadalah dengan menggunakan HTMLelemen tautan, tanpa perlu menambahkan elemen tautan kedocument.body seperti yang dinyatakan dalam jawaban lain.

Anda dapat menggunakan fungsi berikut:

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

Dalam aplikasi saya, saya menggunakannya dengan cara ini:

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

Demo Kerja:

catatan:

  • Anda harus menggunakan link.downloadatribut agar browser tidak membuka file di tab baru dan mengaktifkan pop-up unduhan.
  • Ini telah diuji dengan beberapa jenis file (docx, xlsx, png, pdf, ...).
cнŝdk
sumber
Apa cara terbaik untuk menampilkan gif yang memuat hingga file diunduh?
Ctrl_Alt_Defeat
1
@Ctrl_Alt_Defeat Nah dalam hal ini tidak akan mudah untuk melacak proses download, tapi satu trik dapat menunjukkan animasi gif ini pada linkkali klik dan menyembunyikannya setelah timeout, menggunakan kode ini: link.onclick = function() { document.body.innerText = "The file is being downloaded ..."; setTimeout(function() { document.body.innerText = ""; }, 2000); }, Anda dapat melihatnya bekerja di ini biola , tetapi perlu diingat bahwa ini bukan cara yang disarankan untuk melakukannya, akan lebih baik jika kita menggunakannya Ajax.
cнŝdk
1
itu tidak berfungsi di firefox. bagaimana cara mendownload di firefox?
Manoj Rana
@ManojRana Untuk firefox, Anda dapat menggunakan jawabaniframe lihat ini .
cнŝdk
2
Solusi ini berfungsi di Chrome, Safari, dan Firefox untuk saya :)
ariebear
15

Saya telah mencari cara yang baik untuk menggunakan javascript untuk memulai pengunduhan file, seperti yang disarankan pertanyaan ini. Namun jawaban ini tidak membantu. Saya kemudian melakukan beberapa pengujian xbrowser dan menemukan bahwa iframe berfungsi paling baik di semua browser modern IE> 8.

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" adalah kelas saya untuk mengatur gaya konten yang ada tetapi tidak dapat dilihat.

css:

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

sama seperti .visuallyHidden di html5boilerplate

Saya lebih suka ini daripada metode javascript window.open karena jika tautannya rusak, metode iframe tidak melakukan apa-apa sebagai lawan mengarahkan ke halaman kosong yang mengatakan file tidak dapat dibuka.

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();
alockwood05
sumber
6

Menggunakan API File URL Objek Blob HTML5 :

/**
 * 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)

loretoparisi
sumber
2
Saya merasa ini adalah cara terbaik untuk melakukannya !!
Kushal MK
1
Ini juga merupakan praktik yang baik untuk menelepon URL.revokeObjectURL(url), saat file tidak lagi diperlukan untuk mengosongkan memori
SleepWalker
5

Mengubah lokasi jendela dapat menyebabkan beberapa masalah terutama saat Anda memiliki koneksi yang terus-menerus seperti websocket. Jadi saya selalu menggunakan solusi iframe lama yang bagus.

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();
}
Bnrdo
sumber
5

Jika tautannya ke url file yang valid, cukup menetapkan window.location.href akan berfungsi.

Namun, terkadang tautan tersebut tidak valid, dan diperlukan iFrame.

Lakukan event.preventDefault normal Anda untuk mencegah jendela terbuka, dan jika Anda menggunakan jQuery, ini akan berfungsi:

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

Setelah berjam-jam mencoba, fungsinya lahir :) Saya punya skenario di mana saya harus menampilkan loader tepat waktu ketika file sedang bersiap untuk diunduh:

Bekerja di Chrome, Safari, dan 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)
        }
    });
М.Б.
sumber
0

Bagaimana tentang:

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

Cara ini bekerja pada semua browser (menurut saya) dan membiarkan Anda meletakkan pesan seperti: "Jika unduhan tidak dimulai dalam lima detik, klik di sini."

Jika Anda membutuhkannya harus dengan javascript .. nah ...

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

Salam


sumber
0

Iframe kecil / tersembunyi dapat berfungsi untuk tujuan ini.

Dengan begitu Anda tidak perlu khawatir akan menutup pop up.

Simon
sumber