Unduh File Menggunakan Javascript / jQuery


357

Saya memiliki persyaratan yang sangat mirip yang ditentukan di sini .

Saya harus meminta browser pengguna memulai pengunduhan secara manual ketika $('a#someID').click();

Tetapi saya tidak dapat menggunakan window.hrefmetode ini, karena ini menggantikan konten halaman saat ini dengan file yang Anda coba unduh.

Sebaliknya saya ingin membuka unduhan di jendela / tab baru. Bagaimana ini mungkin?


Saya mencoba banyak jawaban dalam pertanyaan terkait, dan ini adalah jawaban yang pasti .
Basj

Pengaturan window.location.href bekerja untuk saya. Juga konten jendela TIDAK berubah. Saya menganggap Anda menggunakan contentType yang salah?
BluE

Jawaban:


379

Gunakan yang tidak terlihat <iframe>:

<iframe id="my_iframe" style="display:none;"></iframe>
<script>
function Download(url) {
    document.getElementById('my_iframe').src = url;
};
</script>

Untuk memaksa browser mengunduh file yang seharusnya dapat dirender (seperti file HTML atau teks), Anda memerlukan server untuk mengatur Jenis MIME file ke nilai yang tidak masuk akal, seperti application/x-please-download-meatau sebagai alternatif application/octet-stream, yang digunakan untuk biner acak data.

Jika Anda hanya ingin membukanya di tab baru, satu-satunya cara untuk melakukan ini adalah bagi pengguna untuk mengklik pada tautan dengan targetatributnya diatur ke _blank.

Di jQuery:

$('a#someID').attr({target: '_blank', 
                    href  : 'http://localhost/directory/file.pdf'});

Setiap kali tautan itu diklik, ia akan mengunduh file di tab / jendela baru.


4
Halaman web tidak dapat membuka tab baru secara otomatis. Untuk memaksa browser mengunduh, minta server untuk mengirim file pdf dengan tipe MIME yang tidak masuk akal, seperti application / x-please-download-me
Randy the Dev

14
Bagus sekali! Memecahkan masalah dengan baik. Namun, Anda mungkin ingin menggunakan: iframe.style.display = 'none'; karena ini akan sepenuhnya menyembunyikan iframe. Implementasi Anda saat ini akan membuat iframe tidak terlihat, tetapi iframe masih akan memakan ruang di bagian bawah halaman yang menyebabkan ruang ekstra putih.
Akrikos

2
Ini "semi" bekerja untuk saya. Saya membuat html pengujian sederhana berikut: <html> <body> <iframe src = "fileurl"> </iframe> </body> </html> dan itu bisa diunduh, tetapi di konsol krom saya melihat bahwa unduhan telah "dibatalkan" dan muncul dengan warna merah. Ini adalah bagian dari aplikasi web seluler yang lebih besar, dan kenyataan bahwa aplikasi itu dibatalkan akan merusak aplikasi karena hal itu menimbulkan kegagalan web secara umum. Ada jalan lain?
Sagi Mann

27
Cuplikan yang bagus. Namun, pengaturan jenis hal yang tidak masuk akal agak mengganggu. Untuk meminta browser mengunduh file yang dapat direndernya, gunakan tajuk berikut: Content-Disposition: attachment; filename="downloaded.pdf"(tentu saja Anda dapat menyesuaikan nama file sesuai kebutuhan).
rixo

2
Bagaimana cara saya memaksa unduhan tanpa server? Jadi hanya halaman html dengan beberapa javascript.
Rodrigo Ruiz

221

2019 pembaruan browser modern

Inilah pendekatan yang sekarang saya rekomendasikan dengan beberapa peringatan:

  • Diperlukan browser yang relatif modern
  • Jika file diharapkan sangat besar, Anda mungkin harus melakukan sesuatu yang mirip dengan pendekatan asli (iframe dan cookie) karena beberapa operasi di bawah ini mungkin dapat mengkonsumsi memori sistem setidaknya sebesar file yang sedang diunduh dan / atau CPU menarik lainnya. efek samping.

fetch('https://jsonplaceholder.typicode.com/todos/1')
  .then(resp => resp.blob())
  .then(blob => {
    const url = window.URL.createObjectURL(blob);
    const a = document.createElement('a');
    a.style.display = 'none';
    a.href = url;
    // the filename you want
    a.download = 'todo-1.json';
    document.body.appendChild(a);
    a.click();
    window.URL.revokeObjectURL(url);
    alert('your file has downloaded!'); // or you know, something with better UX...
  })
  .catch(() => alert('oh no!'));

2012 pendekatan berbasis jQuery / iframe / cookie asli

Saya telah membuat plugin Unduhan File jQuery ( Demo ) ( GitHub ) yang juga dapat membantu situasi Anda. Ini berfungsi sangat mirip dengan iframe tetapi memiliki beberapa fitur keren yang menurut saya cukup berguna:

  • Sangat mudah diatur dengan visual yang bagus (jQuery UI Dialog, tetapi tidak diharuskan), semuanya juga diuji

  • Pengguna tidak pernah meninggalkan halaman yang sama dengan tempat mereka memulai unduhan file. Fitur ini menjadi sangat penting untuk aplikasi web modern

  • Fungsi successCallback dan failCallback memungkinkan Anda untuk secara eksplisit tentang apa yang dilihat pengguna dalam kedua situasi tersebut

  • Sehubungan dengan jQuery UI, pengembang dapat dengan mudah menunjukkan modal yang memberi tahu pengguna bahwa terjadi unduhan file, membubarkan modal setelah unduhan dimulai atau bahkan memberi tahu pengguna dengan ramah bahwa ada kesalahan. Lihat Demo untuk contohnya. Semoga ini bisa membantu seseorang!

Berikut ini adalah contoh penggunaan sederhana menggunakan sumber plugin dengan janji. The halaman demo mencakup banyak lainnya, 'lebih baik UX' contoh juga.

$.fileDownload('some/file.pdf')
    .done(function () { alert('File download a success!'); })
    .fail(function () { alert('File download failed!'); });

@JohnCulviner: dapatkah saya mengirim data json dalam metode posting Anda. Saya mencobanya dan gagal. Bisakah Anda memberi saya sampel
Saravanan

Apakah mungkin untuk mengirimkan parameter ke panggilan? katakanlah saya harus memberikan beberapa id agar server dapat menghasilkan file yang ingin saya unduh, bagaimana saya bisa melakukannya? terima kasih
omer schleifer

Telah melakukan 100. Suara positif. Terima kasih atas waktu Anda - ini sangat berharga. Pertimbangkan untuk memasang tautan PayPal untuk sumbangan. Saya akan menyumbang.
Stephan Schinkel

Saya mencobanya tetapi panggilan baliknya tidak pernah dieksekusi. Plug-in hanya akan membuka respons layanan di tab baru bahkan ketika layanan kembali kesalahan. Saya tidak ingin aplikasi membuka tab baru dan menampilkan respons layanan ketika terjadi kesalahan. Saya bahkan menambahkan cookie untuk mengindikasikan bahwa file yang diunduh benar dan salah pada keberhasilan dan kegagalan tetapi tetap saja responsnya terbuka di tab baru .. cara apa pun untuk memperbaikinya .. Saya menggunakan metode get.
Vishal Gulati

1
@MarkAmery yang berfungsi juga seperti yang ditunjukkan oleh jawaban lain. Pendekatan itu (AFAIK) tidak memberi Anda umpan balik kapan unduhan dimulai, kapan selesai dan jika itu kesalahan mana yang berguna. Saya bisa menambahkan itu ke jawaban untuk opsi "api dan lupakan". Atribut [unduh] juga tidak memungkinkan POST atau apa pun yang eksotis.
John Culviner

142
function downloadURI(uri, name) 
{
    var link = document.createElement("a");
    // If you don't know the name or want to use
    // the webserver default set name = ''
    link.setAttribute('download', name);
    link.href = uri;
    document.body.appendChild(link);
    link.click();
    link.remove();
}

Periksa apakah browser target Anda akan menjalankan potongan di atas dengan lancar:
http://caniuse.com/#feat=download


1
unduh nama file tidak berubah ... diuji di chrome pada bulan april 2015
Novellizator

7
Bagi saya ini akan menjadi sempurna tetapi tidak bekerja pada Firefox juga. Ada ide?
g07kore

2
Seperti yang disebutkan di caniuse.com/#feat=download , ini hanya berfungsi untuk tautan dengan asal yang sama pada rilis Firefox dan Chrome terbaru. Jadi, jika tautan Anda menunjuk ke domain lain, itu tidak berfungsi di mana pun untuk saat ini.
jean-baptiste

9
Agar dapat bekerja di Firefox, lakukan document.body.appendChild(link)sebelum klik dan setelah klik yang dapat Anda lakukan link.remove()untuk menghindari mencemari DOM.
Okku

1
Anda juga dapat melakukannya link.download = ""agar tetap mempertahankan nama file aslinya dan untuk tidak menyetelnya.
Okku

69

Saya terkejut tidak banyak orang tahu tentang atribut unduhan untuk suatu elemen. Tolong bantu sebarkan berita tentang itu! Anda dapat memiliki tautan html tersembunyi, dan memalsukan klik di atasnya. Jika tautan html memiliki atribut unduhan, ia mengunduh file, bukan melihatnya, apa pun yang terjadi. Ini kodenya. Ini akan mengunduh gambar kucing jika dapat menemukannya.

document.getElementById('download').click();
<a href="https://docs.google.com/uc?id=0B0jH18Lft7ypSmRjdWg1c082Y2M" download id="download" hidden></a>

Catatan: Ini tidak didukung di semua browser: http://www.w3schools.com/tags/att_a_download.asp


12
Tidak didukung di IE dan Safari
MatPag

9
Chrome mengunduh, tetapi Firefox hanya menunjukkan gambarnya.
Saran

+1 untuk memberikan cuplikan yang dapat dieksekusi itu. Menyelamatkan saya waktu untuk mengujinya hanya untuk mengetahui itu tidak akan berhasil.
Doopy

4
Chrome terbaru (Agustus 2018) juga menunjukkan gambar (karena pembatasan keamanan yang absurd) jadi gagal
user1156544

Chrome tidak mengunduh untuk mp4s
Nearoo

53

Saya sarankan menggunakan yang downloadatribut untuk di-download bukannya jQuery:

<a href="your_link" download> file_name </a>

Ini akan mengunduh file Anda, tanpa membukanya.


5
Ini hanya akan mendukung Chrome, Firefox, Opera dan IE (> = 13.0)
Kunal Kakkad

Tepi> = 13, bukan IE. Implementasi Edge 13 juga bermasalah karena nama file diabaikan dan sebaliknya Anda mendapatkan file dengan id sebagai namanya.
David

8
Menurut pendapat saya, ini adalah jawaban yang benar untuk pertanyaan itu. Jawaban lain masuk akal jika Anda harus mendukung browser yang lebih lama dan memerlukan solusi.
crabCRUSHERclamCOLLECTOR

19

Jika Anda sudah menggunakan jQuery, Anda bisa memanfaatkannya untuk menghasilkan potongan yang lebih kecil
. Versi jQuery dari jawaban Andrew:

var $idown;  // Keep it outside of the function, so it's initialized once.
downloadURL : function(url) {
  if ($idown) {
    $idown.attr('src',url);
  } else {
    $idown = $('<iframe>', { id:'idown', src:url }).hide().appendTo('body');
  }
},
//... How to use it:
downloadURL('http://whatever.com/file.pdf');

FYI, Seseorang menyarankan (melalui pengeditan posting saya) untuk menambahkan $ idown.attr ('src', url); setelah membuat iframe untuk pertama kalinya. Saya tidak berpikir diperlukan. Ini sudah mengatur 'src: url' pada langkah pembuatan.
corbacho

Juga untuk berkomentar bahwa akhirnya saya tidak menggunakan solusi ini karena IE 9 tidak suka iframe yang dibuat secara dinamis yang menunjuk ke http: // ketika Anda berada di dalam web https. Saya harus menggunakan "window.location.href", solusi yang memiliki beberapa ketidaknyamanan juga
corbacho

bagian "if ($ idown)" tidak berfungsi untuk saya di Chrome terbaru (24), tetapi hanya menciptakan jumlah iframe yang tak ada habisnya. Mungkin karena saya ingin mengunduh 12 hal sekaligus?
nessur

6
The ifpernyataan benar-benar harus:if( $idown && $idown.length > 0 )
iOnline247

3
Tidak melakukan apa pun di Chrome
jjxtra

11

Bekerja di Chrome, Firefox, dan IE8 dan di atasnya.

var link=document.createElement('a');
document.body.appendChild(link);
link.href=url ;
link.click();

Ini juga berfungsi jika Anda tidak menambahkan tautan ke DOM.
Johnie Karr

Kecuali jika header yang dikembalikan dari server mengindikasikan melakukan sebaliknya, ini hanya akan menavigasi ke url, bukan mengunduh darinya.
Mark Amery

10

Contoh sederhana menggunakan iframe

function downloadURL(url) {
    var hiddenIFrameID = 'hiddenDownloader',
        iframe = document.getElementById(hiddenIFrameID);
    if (iframe === null) {
        iframe = document.createElement('iframe');
        iframe.id = hiddenIFrameID;
        iframe.style.display = 'none';
        document.body.appendChild(iframe);
    }
    iframe.src = url;
};

Kemudian panggil saja fungsi di mana pun Anda inginkan:

downloadURL('path/to/my/file');


10

Ini bisa membantu jika Anda tidak perlu menavigasi halaman lain. Ini adalah fungsi dasar javascript, sehingga dapat digunakan di platform mana pun di mana backend berada dalam Javascript

window.location.assign('any url or file path')

Ini mungkin solusi termudah jika Anda dapat mengatur contentType sendiri. Saya menggunakannya sebagai: window.location.href = downloadFileUrl;
BluE

Jika admin tidak ingin menampilkan URL kepada pengguna daripada?
Naren Verma

9

Hanya tujuh tahun kemudian di sini datang solusi jQuery satu baris menggunakan formulir, bukan iframe atau tautan:

$('<form></form>')
     .attr('action', filePath)
     .appendTo('body').submit().remove();

Saya sudah menguji ini

  • Chrome 55
  • Firefox 50
  • Edge IE8-10
  • iOS 10 (Safari / Chrome)
  • Android Chrome

Jika ada yang tahu ada kerugian dengan solusi ini saya akan sangat senang mendengarnya.


Demo penuh:

<html>
<head><script src="https://code.jquery.com/jquery-1.11.3.js"></script></head>
<body>
<script>
    var filePath = window.prompt("Enter a file URL","http://jqueryui.com/resources/download/jquery-ui-1.12.1.zip");
    $('<form></form>').attr('action', filePath).appendTo('body').submit().remove();
</script>
</body>
</html>

7
Ini tidak berfungsi jika Anda filePathmemiliki querystring karena mengirimkan formulir akan menimpa querystring dalam atribut action.
Bobort

1
Saya mengatasinya dengan menambahkan input ke formulir: var authInput = $("<input>").attr("type", "hidden").attr("name", "myQsKey").val('MyQsValue'); $('<form></form>') .attr('action', filePath) .append($(authInput)) .appendTo('body').submit().remove();Ini adalah akses yang setara:filepath?myQsKey=myValue
Harald Hoerwick

Ini juga menutup soket web.
radu122

2
Ini tampak seperti cara yang sangat rumit untuk set window.locationke filePath. Hanya window.location = filePath;akan melakukan hal yang sama.
Ivo Smits

Terlepas dari apakah ada kerugian untuk solusi ini, Anda sendiri, Anda belum memberikan sisi positif untuk menggunakan ini melalui tautan. (Dan ada kerugiannya: Anda tidak dapat menggunakan downloadatribut dengan cara ini untuk memberi tahu browser bahwa Anda ingin mengunduh terlepas dari header apa yang dikembalikan server, yang dapat Anda lakukan dengan sebuah aelemen.)
Mark Amery

5

Saya tidak tahu apakah pertanyaannya terlalu lama, tetapi pengaturan window.lokasi ke url unduhan akan berfungsi, asalkan tipe unduhan mime benar (misalnya arsip zip).

var download = function(downloadURL) {

   location = downloadURL;

});

download('http://example.com/archive.zip'); //correct usage
download('http://example.com/page.html'); //DON'T

5

Saya akhirnya menggunakan potongan di bawah ini dan berfungsi di sebagian besar browser, tidak diuji di IE sekalipun.

let data = JSON.stringify([{email: "test@domain.com", name: "test"}, {email: "anothertest@example.com", name: "anothertest"}]);

let type = "application/json", name = "testfile.json";
downloader(data, type, name)

function downloader(data, type, name) {
	let blob = new Blob([data], {type});
	let url = window.URL.createObjectURL(blob);
	downloadURI(url, name);
	window.URL.revokeObjectURL(url);
}

function downloadURI(uri, name) {
    let link = document.createElement("a");
    link.download = name;
    link.href = uri;
    link.click();
}

Memperbarui

function downloadURI(uri, name) {
    let link = document.createElement("a");
    link.download = name;
    link.href = uri;
    link.click();
}

function downloader(data, type, name) {
    let blob = new Blob([data], {type});
    let url = window.URL.createObjectURL(blob);
    downloadURI(url, name);
    window.URL.revokeObjectURL(url);
}

Apa gunanya menggunakan di MouseEventsini daripada selalu menggunakan click? Dan mengapa menambahkan tautan ke dokumen sebelum mengkliknya? Mungkin ini memiliki keunggulan dibandingkan pendekatan sederhana yang ditampilkan di stackoverflow.com/a/23013574/1709587 , tetapi jika demikian, mereka tidak dijelaskan di sini.
Mark Amery

Sudah lama saya memposting jawaban ini. Saya tidak ingat apakah ada alasan di balik baris kode yang tidak perlu itu.
Abk

3

Untuk meningkatkan jawaban Imagine Breaker, ini didukung pada FF & IE:

var evt = document.createEvent("MouseEvents");
evt.initMouseEvent("click", true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);

function downloadURI(uri, name) {
    var link = document.createElement("a");
    link.download = name;
    link.href = uri;
    link.dispatchEvent(evt);
}

Dengan kata lain, cukup gunakan dispatchEventfungsi alih-alih click();


Bagaimana ini merupakan perbaikan? Tampaknya menjadi cara yang lebih rumit untuk melakukan hal yang sama.
Mark Amery

3

Mungkin javascript Anda hanya membuka halaman yang baru saja mengunduh file, seperti saat Anda menyeret tautan unduhan ke tab baru:

Window.open("https://www.MyServer.
Org/downloads/ardiuno/WgiWho=?:8080")

Dengan jendela yang terbuka, buka halaman unduhan yang otomatis ditutup.


1
Ini menciptakan jendela sembulan, yang diblokir sebagian besar browser
Ashton Wiersdorf

3

Kode Paling Lengkap dan Berfungsi (Diuji) untuk Mengunduh Data Untuk FireFox, Chrome dan Kode IE adalah Mengikuti. Asumsikan bahwa Data berada dalam bidang texarea , yang memiliki id = 'textarea_area' dan nama file adalah nama file tempat data akan diunduh.

function download(filename) {
    if (typeof filename==='undefined') filename = ""; // default
    value = document.getElementById('textarea_area').value;

    filetype="text/*";
    extension=filename.substring(filename.lastIndexOf("."));
    for (var i = 0; i < extToMIME.length; i++) {
        if (extToMIME[i][0].localeCompare(extension)==0) {
            filetype=extToMIME[i][1];
            break;
        }
    }


    var pom = document.createElement('a');
    pom.setAttribute('href', 'data: '+filetype+';charset=utf-8,' + '\ufeff' + encodeURIComponent(value)); // Added BOM too
    pom.setAttribute('download', filename);


    if (document.createEvent) {
        if (navigator.userAgent.indexOf('MSIE') !== -1 || navigator.appVersion.indexOf('Trident/') > 0) { // IE
            blobObject = new Blob(['\ufeff'+value]);
            window.navigator.msSaveBlob(blobObject, filename);
        } else { // FF, Chrome
            var event = document.createEvent('MouseEvents');
            event.initEvent('click', true, true);
            pom.dispatchEvent(event);
        }
    } else if( document.createEventObject ) { // Have No Idea
        var evObj = document.createEventObject();
        pom.fireEvent( 'onclick' , evObj );
    } else { // For Any Case
        pom.click();
    }

}

dan kemudian panggil saja

<a href="javascript:download();">Download</a>

Untuk Memulai Pengunduhan.

Array untuk pengaturan tipe MIME yang benar untuk dialog unduhan DAPAT mengikuti:

// ----------------------- Extensions to MIME --------- //

        // List of mime types
        // combination of values from Windows 7 Registry and 
        // from C:\Windows\System32\inetsrv\config\applicationHost.config
        // some added, including .7z and .dat
    var extToMIME = [
        [".323", "text/h323"],
        [".3g2", "video/3gpp2"],
        [".3gp", "video/3gpp"],
        [".3gp2", "video/3gpp2"],
        [".3gpp", "video/3gpp"],
        [".7z", "application/x-7z-compressed"],
        [".aa", "audio/audible"],
        [".AAC", "audio/aac"],
        [".aaf", "application/octet-stream"],
        [".aax", "audio/vnd.audible.aax"],
        [".ac3", "audio/ac3"],
        [".aca", "application/octet-stream"],
        [".accda", "application/msaccess.addin"],
        [".accdb", "application/msaccess"],
        [".accdc", "application/msaccess.cab"],
        [".accde", "application/msaccess"],
        [".accdr", "application/msaccess.runtime"],
        [".accdt", "application/msaccess"],
        [".accdw", "application/msaccess.webapplication"],
        [".accft", "application/msaccess.ftemplate"],
        [".acx", "application/internet-property-stream"],
        [".AddIn", "text/xml"],
        [".ade", "application/msaccess"],
        [".adobebridge", "application/x-bridge-url"],
        [".adp", "application/msaccess"],
        [".ADT", "audio/vnd.dlna.adts"],
        [".ADTS", "audio/aac"],
        [".afm", "application/octet-stream"],
        [".ai", "application/postscript"],
        [".aif", "audio/x-aiff"],
        [".aifc", "audio/aiff"],
        [".aiff", "audio/aiff"],
        [".air", "application/vnd.adobe.air-application-installer-package+zip"],
        [".amc", "application/x-mpeg"],
        [".application", "application/x-ms-application"],
        [".art", "image/x-jg"],
        [".asa", "application/xml"],
        [".asax", "application/xml"],
        [".ascx", "application/xml"],
        [".asd", "application/octet-stream"],
        [".asf", "video/x-ms-asf"],
        [".ashx", "application/xml"],
        [".asi", "application/octet-stream"],
        [".asm", "text/plain"],
        [".asmx", "application/xml"],
        [".aspx", "application/xml"],
        [".asr", "video/x-ms-asf"],
        [".asx", "video/x-ms-asf"],
        [".atom", "application/atom+xml"],
        [".au", "audio/basic"],
        [".avi", "video/x-msvideo"],
        [".axs", "application/olescript"],
        [".bas", "text/plain"],
        [".bcpio", "application/x-bcpio"],
        [".bin", "application/octet-stream"],
        [".bmp", "image/bmp"],
        [".c", "text/plain"],
        [".cab", "application/octet-stream"],
        [".caf", "audio/x-caf"],
        [".calx", "application/vnd.ms-office.calx"],
        [".cat", "application/vnd.ms-pki.seccat"],
        [".cc", "text/plain"],
        [".cd", "text/plain"],
        [".cdda", "audio/aiff"],
        [".cdf", "application/x-cdf"],
        [".cer", "application/x-x509-ca-cert"],
        [".chm", "application/octet-stream"],
        [".class", "application/x-java-applet"],
        [".clp", "application/x-msclip"],
        [".cmx", "image/x-cmx"],
        [".cnf", "text/plain"],
        [".cod", "image/cis-cod"],
        [".config", "application/xml"],
        [".contact", "text/x-ms-contact"],
        [".coverage", "application/xml"],
        [".cpio", "application/x-cpio"],
        [".cpp", "text/plain"],
        [".crd", "application/x-mscardfile"],
        [".crl", "application/pkix-crl"],
        [".crt", "application/x-x509-ca-cert"],
        [".cs", "text/plain"],
        [".csdproj", "text/plain"],
        [".csh", "application/x-csh"],
        [".csproj", "text/plain"],
        [".css", "text/css"],
        [".csv", "text/csv"],
        [".cur", "application/octet-stream"],
        [".cxx", "text/plain"],
        [".dat", "application/octet-stream"],
        [".datasource", "application/xml"],
        [".dbproj", "text/plain"],
        [".dcr", "application/x-director"],
        [".def", "text/plain"],
        [".deploy", "application/octet-stream"],
        [".der", "application/x-x509-ca-cert"],
        [".dgml", "application/xml"],
        [".dib", "image/bmp"],
        [".dif", "video/x-dv"],
        [".dir", "application/x-director"],
        [".disco", "text/xml"],
        [".dll", "application/x-msdownload"],
        [".dll.config", "text/xml"],
        [".dlm", "text/dlm"],
        [".doc", "application/msword"],
        [".docm", "application/vnd.ms-word.document.macroEnabled.12"],
        [".docx", "application/vnd.openxmlformats-officedocument.wordprocessingml.document"],
        [".dot", "application/msword"],
        [".dotm", "application/vnd.ms-word.template.macroEnabled.12"],
        [".dotx", "application/vnd.openxmlformats-officedocument.wordprocessingml.template"],
        [".dsp", "application/octet-stream"],
        [".dsw", "text/plain"],
        [".dtd", "text/xml"],
        [".dtsConfig", "text/xml"],
        [".dv", "video/x-dv"],
        [".dvi", "application/x-dvi"],
        [".dwf", "drawing/x-dwf"],
        [".dwp", "application/octet-stream"],
        [".dxr", "application/x-director"],
        [".eml", "message/rfc822"],
        [".emz", "application/octet-stream"],
        [".eot", "application/octet-stream"],
        [".eps", "application/postscript"],
        [".etl", "application/etl"],
        [".etx", "text/x-setext"],
        [".evy", "application/envoy"],
        [".exe", "application/octet-stream"],
        [".exe.config", "text/xml"],
        [".fdf", "application/vnd.fdf"],
        [".fif", "application/fractals"],
        [".filters", "Application/xml"],
        [".fla", "application/octet-stream"],
        [".flr", "x-world/x-vrml"],
        [".flv", "video/x-flv"],
        [".fsscript", "application/fsharp-script"],
        [".fsx", "application/fsharp-script"],
        [".generictest", "application/xml"],
        [".gif", "image/gif"],
        [".group", "text/x-ms-group"],
        [".gsm", "audio/x-gsm"],
        [".gtar", "application/x-gtar"],
        [".gz", "application/x-gzip"],
        [".h", "text/plain"],
        [".hdf", "application/x-hdf"],
        [".hdml", "text/x-hdml"],
        [".hhc", "application/x-oleobject"],
        [".hhk", "application/octet-stream"],
        [".hhp", "application/octet-stream"],
        [".hlp", "application/winhlp"],
        [".hpp", "text/plain"],
        [".hqx", "application/mac-binhex40"],
        [".hta", "application/hta"],
        [".htc", "text/x-component"],
        [".htm", "text/html"],
        [".html", "text/html"],
        [".htt", "text/webviewhtml"],
        [".hxa", "application/xml"],
        [".hxc", "application/xml"],
        [".hxd", "application/octet-stream"],
        [".hxe", "application/xml"],
        [".hxf", "application/xml"],
        [".hxh", "application/octet-stream"],
        [".hxi", "application/octet-stream"],
        [".hxk", "application/xml"],
        [".hxq", "application/octet-stream"],
        [".hxr", "application/octet-stream"],
        [".hxs", "application/octet-stream"],
        [".hxt", "text/html"],
        [".hxv", "application/xml"],
        [".hxw", "application/octet-stream"],
        [".hxx", "text/plain"],
        [".i", "text/plain"],
        [".ico", "image/x-icon"],
        [".ics", "application/octet-stream"],
        [".idl", "text/plain"],
        [".ief", "image/ief"],
        [".iii", "application/x-iphone"],
        [".inc", "text/plain"],
        [".inf", "application/octet-stream"],
        [".inl", "text/plain"],
        [".ins", "application/x-internet-signup"],
        [".ipa", "application/x-itunes-ipa"],
        [".ipg", "application/x-itunes-ipg"],
        [".ipproj", "text/plain"],
        [".ipsw", "application/x-itunes-ipsw"],
        [".iqy", "text/x-ms-iqy"],
        [".isp", "application/x-internet-signup"],
        [".ite", "application/x-itunes-ite"],
        [".itlp", "application/x-itunes-itlp"],
        [".itms", "application/x-itunes-itms"],
        [".itpc", "application/x-itunes-itpc"],
        [".IVF", "video/x-ivf"],
        [".jar", "application/java-archive"],
        [".java", "application/octet-stream"],
        [".jck", "application/liquidmotion"],
        [".jcz", "application/liquidmotion"],
        [".jfif", "image/pjpeg"],
        [".jnlp", "application/x-java-jnlp-file"],
        [".jpb", "application/octet-stream"],
        [".jpe", "image/jpeg"],
        [".jpeg", "image/jpeg"],
        [".jpg", "image/jpeg"],
        [".js", "application/x-javascript"],
        [".json", "application/json"],
        [".jsx", "text/jscript"],
        [".jsxbin", "text/plain"],
        [".latex", "application/x-latex"],
        [".library-ms", "application/windows-library+xml"],
        [".lit", "application/x-ms-reader"],
        [".loadtest", "application/xml"],
        [".lpk", "application/octet-stream"],
        [".lsf", "video/x-la-asf"],
        [".lst", "text/plain"],
        [".lsx", "video/x-la-asf"],
        [".lzh", "application/octet-stream"],
        [".m13", "application/x-msmediaview"],
        [".m14", "application/x-msmediaview"],
        [".m1v", "video/mpeg"],
        [".m2t", "video/vnd.dlna.mpeg-tts"],
        [".m2ts", "video/vnd.dlna.mpeg-tts"],
        [".m2v", "video/mpeg"],
        [".m3u", "audio/x-mpegurl"],
        [".m3u8", "audio/x-mpegurl"],
        [".m4a", "audio/m4a"],
        [".m4b", "audio/m4b"],
        [".m4p", "audio/m4p"],
        [".m4r", "audio/x-m4r"],
        [".m4v", "video/x-m4v"],
        [".mac", "image/x-macpaint"],
        [".mak", "text/plain"],
        [".man", "application/x-troff-man"],
        [".manifest", "application/x-ms-manifest"],
        [".map", "text/plain"],
        [".master", "application/xml"],
        [".mda", "application/msaccess"],
        [".mdb", "application/x-msaccess"],
        [".mde", "application/msaccess"],
        [".mdp", "application/octet-stream"],
        [".me", "application/x-troff-me"],
        [".mfp", "application/x-shockwave-flash"],
        [".mht", "message/rfc822"],
        [".mhtml", "message/rfc822"],
        [".mid", "audio/mid"],
        [".midi", "audio/mid"],
        [".mix", "application/octet-stream"],
        [".mk", "text/plain"],
        [".mmf", "application/x-smaf"],
        [".mno", "text/xml"],
        [".mny", "application/x-msmoney"],
        [".mod", "video/mpeg"],
        [".mov", "video/quicktime"],
        [".movie", "video/x-sgi-movie"],
        [".mp2", "video/mpeg"],
        [".mp2v", "video/mpeg"],
        [".mp3", "audio/mpeg"],
        [".mp4", "video/mp4"],
        [".mp4v", "video/mp4"],
        [".mpa", "video/mpeg"],
        [".mpe", "video/mpeg"],
        [".mpeg", "video/mpeg"],
        [".mpf", "application/vnd.ms-mediapackage"],
        [".mpg", "video/mpeg"],
        [".mpp", "application/vnd.ms-project"],
        [".mpv2", "video/mpeg"],
        [".mqv", "video/quicktime"],
        [".ms", "application/x-troff-ms"],
        [".msi", "application/octet-stream"],
        [".mso", "application/octet-stream"],
        [".mts", "video/vnd.dlna.mpeg-tts"],
        [".mtx", "application/xml"],
        [".mvb", "application/x-msmediaview"],
        [".mvc", "application/x-miva-compiled"],
        [".mxp", "application/x-mmxp"],
        [".nc", "application/x-netcdf"],
        [".nsc", "video/x-ms-asf"],
        [".nws", "message/rfc822"],
        [".ocx", "application/octet-stream"],
        [".oda", "application/oda"],
        [".odc", "text/x-ms-odc"],
        [".odh", "text/plain"],
        [".odl", "text/plain"],
        [".odp", "application/vnd.oasis.opendocument.presentation"],
        [".ods", "application/oleobject"],
        [".odt", "application/vnd.oasis.opendocument.text"],
        [".one", "application/onenote"],
        [".onea", "application/onenote"],
        [".onepkg", "application/onenote"],
        [".onetmp", "application/onenote"],
        [".onetoc", "application/onenote"],
        [".onetoc2", "application/onenote"],
        [".orderedtest", "application/xml"],
        [".osdx", "application/opensearchdescription+xml"],
        [".p10", "application/pkcs10"],
        [".p12", "application/x-pkcs12"],
        [".p7b", "application/x-pkcs7-certificates"],
        [".p7c", "application/pkcs7-mime"],
        [".p7m", "application/pkcs7-mime"],
        [".p7r", "application/x-pkcs7-certreqresp"],
        [".p7s", "application/pkcs7-signature"],
        [".pbm", "image/x-portable-bitmap"],
        [".pcast", "application/x-podcast"],
        [".pct", "image/pict"],
        [".pcx", "application/octet-stream"],
        [".pcz", "application/octet-stream"],
        [".pdf", "application/pdf"],
        [".pfb", "application/octet-stream"],
        [".pfm", "application/octet-stream"],
        [".pfx", "application/x-pkcs12"],
        [".pgm", "image/x-portable-graymap"],
        [".pic", "image/pict"],
        [".pict", "image/pict"],
        [".pkgdef", "text/plain"],
        [".pkgundef", "text/plain"],
        [".pko", "application/vnd.ms-pki.pko"],
        [".pls", "audio/scpls"],
        [".pma", "application/x-perfmon"],
        [".pmc", "application/x-perfmon"],
        [".pml", "application/x-perfmon"],
        [".pmr", "application/x-perfmon"],
        [".pmw", "application/x-perfmon"],
        [".png", "image/png"],
        [".pnm", "image/x-portable-anymap"],
        [".pnt", "image/x-macpaint"],
        [".pntg", "image/x-macpaint"],
        [".pnz", "image/png"],
        [".pot", "application/vnd.ms-powerpoint"],
        [".potm", "application/vnd.ms-powerpoint.template.macroEnabled.12"],
        [".potx", "application/vnd.openxmlformats-officedocument.presentationml.template"],
        [".ppa", "application/vnd.ms-powerpoint"],
        [".ppam", "application/vnd.ms-powerpoint.addin.macroEnabled.12"],
        [".ppm", "image/x-portable-pixmap"],
        [".pps", "application/vnd.ms-powerpoint"],
        [".ppsm", "application/vnd.ms-powerpoint.slideshow.macroEnabled.12"],
        [".ppsx", "application/vnd.openxmlformats-officedocument.presentationml.slideshow"],
        [".ppt", "application/vnd.ms-powerpoint"],
        [".pptm", "application/vnd.ms-powerpoint.presentation.macroEnabled.12"],
        [".pptx", "application/vnd.openxmlformats-officedocument.presentationml.presentation"],
        [".prf", "application/pics-rules"],
        [".prm", "application/octet-stream"],
        [".prx", "application/octet-stream"],
        [".ps", "application/postscript"],
        [".psc1", "application/PowerShell"],
        [".psd", "application/octet-stream"],
        [".psess", "application/xml"],
        [".psm", "application/octet-stream"],
        [".psp", "application/octet-stream"],
        [".pub", "application/x-mspublisher"],
        [".pwz", "application/vnd.ms-powerpoint"],
        [".qht", "text/x-html-insertion"],
        [".qhtm", "text/x-html-insertion"],
        [".qt", "video/quicktime"],
        [".qti", "image/x-quicktime"],
        [".qtif", "image/x-quicktime"],
        [".qtl", "application/x-quicktimeplayer"],
        [".qxd", "application/octet-stream"],
        [".ra", "audio/x-pn-realaudio"],
        [".ram", "audio/x-pn-realaudio"],
        [".rar", "application/octet-stream"],
        [".ras", "image/x-cmu-raster"],
        [".rat", "application/rat-file"],
        [".rc", "text/plain"],
        [".rc2", "text/plain"],
        [".rct", "text/plain"],
        [".rdlc", "application/xml"],
        [".resx", "application/xml"],
        [".rf", "image/vnd.rn-realflash"],
        [".rgb", "image/x-rgb"],
        [".rgs", "text/plain"],
        [".rm", "application/vnd.rn-realmedia"],
        [".rmi", "audio/mid"],
        [".rmp", "application/vnd.rn-rn_music_package"],
        [".roff", "application/x-troff"],
        [".rpm", "audio/x-pn-realaudio-plugin"],
        [".rqy", "text/x-ms-rqy"],
        [".rtf", "application/rtf"],
        [".rtx", "text/richtext"],
        [".ruleset", "application/xml"],
        [".s", "text/plain"],
        [".safariextz", "application/x-safari-safariextz"],
        [".scd", "application/x-msschedule"],
        [".sct", "text/scriptlet"],
        [".sd2", "audio/x-sd2"],
        [".sdp", "application/sdp"],
        [".sea", "application/octet-stream"],
        [".searchConnector-ms", "application/windows-search-connector+xml"],
        [".setpay", "application/set-payment-initiation"],
        [".setreg", "application/set-registration-initiation"],
        [".settings", "application/xml"],
        [".sgimb", "application/x-sgimb"],
        [".sgml", "text/sgml"],
        [".sh", "application/x-sh"],
        [".shar", "application/x-shar"],
        [".shtml", "text/html"],
        [".sit", "application/x-stuffit"],
        [".sitemap", "application/xml"],
        [".skin", "application/xml"],
        [".sldm", "application/vnd.ms-powerpoint.slide.macroEnabled.12"],
        [".sldx", "application/vnd.openxmlformats-officedocument.presentationml.slide"],
        [".slk", "application/vnd.ms-excel"],
        [".sln", "text/plain"],
        [".slupkg-ms", "application/x-ms-license"],
        [".smd", "audio/x-smd"],
        [".smi", "application/octet-stream"],
        [".smx", "audio/x-smd"],
        [".smz", "audio/x-smd"],
        [".snd", "audio/basic"],
        [".snippet", "application/xml"],
        [".snp", "application/octet-stream"],
        [".sol", "text/plain"],
        [".sor", "text/plain"],
        [".spc", "application/x-pkcs7-certificates"],
        [".spl", "application/futuresplash"],
        [".src", "application/x-wais-source"],
        [".srf", "text/plain"],
        [".SSISDeploymentManifest", "text/xml"],
        [".ssm", "application/streamingmedia"],
        [".sst", "application/vnd.ms-pki.certstore"],
        [".stl", "application/vnd.ms-pki.stl"],
        [".sv4cpio", "application/x-sv4cpio"],
        [".sv4crc", "application/x-sv4crc"],
        [".svc", "application/xml"],
        [".swf", "application/x-shockwave-flash"],
        [".t", "application/x-troff"],
        [".tar", "application/x-tar"],
        [".tcl", "application/x-tcl"],
        [".testrunconfig", "application/xml"],
        [".testsettings", "application/xml"],
        [".tex", "application/x-tex"],
        [".texi", "application/x-texinfo"],
        [".texinfo", "application/x-texinfo"],
        [".tgz", "application/x-compressed"],
        [".thmx", "application/vnd.ms-officetheme"],
        [".thn", "application/octet-stream"],
        [".tif", "image/tiff"],
        [".tiff", "image/tiff"],
        [".tlh", "text/plain"],
        [".tli", "text/plain"],
        [".toc", "application/octet-stream"],
        [".tr", "application/x-troff"],
        [".trm", "application/x-msterminal"],
        [".trx", "application/xml"],
        [".ts", "video/vnd.dlna.mpeg-tts"],
        [".tsv", "text/tab-separated-values"],
        [".ttf", "application/octet-stream"],
        [".tts", "video/vnd.dlna.mpeg-tts"],
        [".txt", "text/plain"],
        [".u32", "application/octet-stream"],
        [".uls", "text/iuls"],
        [".user", "text/plain"],
        [".ustar", "application/x-ustar"],
        [".vb", "text/plain"],
        [".vbdproj", "text/plain"],
        [".vbk", "video/mpeg"],
        [".vbproj", "text/plain"],
        [".vbs", "text/vbscript"],
        [".vcf", "text/x-vcard"],
        [".vcproj", "Application/xml"],
        [".vcs", "text/plain"],
        [".vcxproj", "Application/xml"],
        [".vddproj", "text/plain"],
        [".vdp", "text/plain"],
        [".vdproj", "text/plain"],
        [".vdx", "application/vnd.ms-visio.viewer"],
        [".vml", "text/xml"],
        [".vscontent", "application/xml"],
        [".vsct", "text/xml"],
        [".vsd", "application/vnd.visio"],
        [".vsi", "application/ms-vsi"],
        [".vsix", "application/vsix"],
        [".vsixlangpack", "text/xml"],
        [".vsixmanifest", "text/xml"],
        [".vsmdi", "application/xml"],
        [".vspscc", "text/plain"],
        [".vss", "application/vnd.visio"],
        [".vsscc", "text/plain"],
        [".vssettings", "text/xml"],
        [".vssscc", "text/plain"],
        [".vst", "application/vnd.visio"],
        [".vstemplate", "text/xml"],
        [".vsto", "application/x-ms-vsto"],
        [".vsw", "application/vnd.visio"],
        [".vsx", "application/vnd.visio"],
        [".vtx", "application/vnd.visio"],
        [".wav", "audio/wav"],
        [".wave", "audio/wav"],
        [".wax", "audio/x-ms-wax"],
        [".wbk", "application/msword"],
        [".wbmp", "image/vnd.wap.wbmp"],
        [".wcm", "application/vnd.ms-works"],
        [".wdb", "application/vnd.ms-works"],
        [".wdp", "image/vnd.ms-photo"],
        [".webarchive", "application/x-safari-webarchive"],
        [".webtest", "application/xml"],
        [".wiq", "application/xml"],
        [".wiz", "application/msword"],
        [".wks", "application/vnd.ms-works"],
        [".WLMP", "application/wlmoviemaker"],
        [".wlpginstall", "application/x-wlpg-detect"],
        [".wlpginstall3", "application/x-wlpg3-detect"],
        [".wm", "video/x-ms-wm"],
        [".wma", "audio/x-ms-wma"],
        [".wmd", "application/x-ms-wmd"],
        [".wmf", "application/x-msmetafile"],
        [".wml", "text/vnd.wap.wml"],
        [".wmlc", "application/vnd.wap.wmlc"],
        [".wmls", "text/vnd.wap.wmlscript"],
        [".wmlsc", "application/vnd.wap.wmlscriptc"],
        [".wmp", "video/x-ms-wmp"],
        [".wmv", "video/x-ms-wmv"],
        [".wmx", "video/x-ms-wmx"],
        [".wmz", "application/x-ms-wmz"],
        [".wpl", "application/vnd.ms-wpl"],
        [".wps", "application/vnd.ms-works"],
        [".wri", "application/x-mswrite"],
        [".wrl", "x-world/x-vrml"],
        [".wrz", "x-world/x-vrml"],
        [".wsc", "text/scriptlet"],
        [".wsdl", "text/xml"],
        [".wvx", "video/x-ms-wvx"],
        [".x", "application/directx"],
        [".xaf", "x-world/x-vrml"],
        [".xaml", "application/xaml+xml"],
        [".xap", "application/x-silverlight-app"],
        [".xbap", "application/x-ms-xbap"],
        [".xbm", "image/x-xbitmap"],
        [".xdr", "text/plain"],
        [".xht", "application/xhtml+xml"],
        [".xhtml", "application/xhtml+xml"],
        [".xla", "application/vnd.ms-excel"],
        [".xlam", "application/vnd.ms-excel.addin.macroEnabled.12"],
        [".xlc", "application/vnd.ms-excel"],
        [".xld", "application/vnd.ms-excel"],
        [".xlk", "application/vnd.ms-excel"],
        [".xll", "application/vnd.ms-excel"],
        [".xlm", "application/vnd.ms-excel"],
        [".xls", "application/vnd.ms-excel"],
        [".xlsb", "application/vnd.ms-excel.sheet.binary.macroEnabled.12"],
        [".xlsm", "application/vnd.ms-excel.sheet.macroEnabled.12"],
        [".xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"],
        [".xlt", "application/vnd.ms-excel"],
        [".xltm", "application/vnd.ms-excel.template.macroEnabled.12"],
        [".xltx", "application/vnd.openxmlformats-officedocument.spreadsheetml.template"],
        [".xlw", "application/vnd.ms-excel"],
        [".xml", "text/xml"],
        [".xmta", "application/xml"],
        [".xof", "x-world/x-vrml"],
        [".XOML", "text/plain"],
        [".xpm", "image/x-xpixmap"],
        [".xps", "application/vnd.ms-xpsdocument"],
        [".xrm-ms", "text/xml"],
        [".xsc", "application/xml"],
        [".xsd", "text/xml"],
        [".xsf", "text/xml"],
        [".xsl", "text/xml"],
        [".xslt", "text/xml"],
        [".xsn", "application/octet-stream"],
        [".xss", "application/xml"],
        [".xtp", "application/octet-stream"],
        [".xwd", "image/x-xwindowdump"],
        [".z", "application/x-compress"],
        [".zip", "application/x-zip-compressed"]
];

// ----------------------- End of Extensions to MIME --------- //

- Saya mencoba ini dengan file pdf. File sedang diunduh tetapi selalu rusak. Ada saran? Terima kasih
Shrivaths Kulkarni

2

bagi saya ini berfungsi ok diuji di chrome v72

function down_file(url,name){
var a = $("<a>")
    .attr("href", url)
    .attr("download", name)
    .appendTo("body");
a[0].click();
a.remove();
}

down_file('https://www.useotools.com/uploads/nulogo[1].png','logo.png')

Ini hanya pendekatan yang sama seperti yang ditunjukkan dalam jawaban Imagine Breaker tahun sebelumnya, tetapi dengan tambahan kerugian membutuhkan jQuery.
Mark Amery

1

Saya memiliki hasil yang baik dengan menggunakan tag FORMULIR karena ia bekerja di mana-mana dan Anda tidak perlu membuat file sementara di server. Metodenya bekerja seperti ini.

Di sisi klien (halaman HTML) Anda membuat formulir yang tidak terlihat seperti ini

<form method="POST" action="/download.php" target="_blank" id="downloadForm">
    <input type="hidden" name="data" id="csv">
</form>

Kemudian Anda menambahkan kode Javascript ini ke tombol Anda:

$('#button').click(function() {
     $('#csv').val('---your data---');
     $('#downloadForm').submit();
}

Di sisi server Anda memiliki kode PHP berikut download.php:

<?php
header('Content-Type: text/csv');
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=out.csv');
header('Content-Transfer-Encoding: binary');
header('Connection: Keep-Alive');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: ' . strlen($data));

echo $_REQUEST['data'];
exit();

Anda bahkan dapat membuat file zip data Anda seperti ini:

<?php

$file = tempnam("tmp", "zip");

$zip = new ZipArchive();
$zip->open($file, ZipArchive::OVERWRITE);
$zip->addFromString('test.csv', $_REQUEST['data']);
$zip->close();

header('Content-Type: application/zip');
header('Content-Length: ' . filesize($file));
header('Content-Disposition: attachment; filename="file.zip"');
readfile($file);
unlink($file); 

Bagian terbaiknya adalah tidak meninggalkan file residu di server Anda karena semuanya dibuat dan dihancurkan dengan cepat!


0

Jawaban yang diajukan oleh hitesh pada 30 Desember '13 ternyata bekerja. Itu hanya membutuhkan sedikit penyesuaian:

File PHP dapat memanggil dirinya sendiri. Dengan kata lain, cukup buat file bernama saveAs.php, dan masukkan kode ini ke dalamnya ...

        <a href="saveAs.php?file_source=YourDataFile.pdf">Download pdf here</a>

    <?php
        if (isset($_GET['file_source'])) {
            $fullPath = $_GET['file_source'];
            if($fullPath) {
                $fsize = filesize($fullPath);
                $path_parts = pathinfo($fullPath);
                $ext = strtolower($path_parts["extension"]);
                switch ($ext) {
                    case "pdf":
                    header("Content-Disposition: attachment; filename=\"".$path_parts["basename"]."\""); // use 'attachment' to force a download
                    header("Content-type: application/pdf"); // add here more headers for diff. extensions
                    break;
                    default;
                    header("Content-type: application/octet-stream");
                    header("Content-Disposition: filename=\"".$path_parts["basename"]."\"");
                }
                if($fsize) {//checking if file size exist
                  header("Content-length: $fsize");
                }
                readfile($fullPath);
                exit;
            }
        }
    ?>

0

Fungsi-fungsi ini digunakan di stacktrace.js :

/**
 * Try XHR methods in order and store XHR factory.
 *
 * @return <Function> XHR function or equivalent
 */
var createXMLHTTPObject = function() {
    var xmlhttp, XMLHttpFactories = [
        function() {
            return new XMLHttpRequest();
        }, function() {
            return new ActiveXObject('Msxml2.XMLHTTP');
        }, function() {
            return new ActiveXObject('Msxml3.XMLHTTP');
        }, function() {
            return new ActiveXObject('Microsoft.XMLHTTP');
        }
    ];
    for (var i = 0; i < XMLHttpFactories.length; i++) {
        try {
            xmlhttp = XMLHttpFactories[i]();
            // Use memoization to cache the factory
            createXMLHTTPObject = XMLHttpFactories[i];
            return xmlhttp;
        } catch (e) {
        }
    }
}

/**
 * @return the text from a given URL
 */
function ajax(url) {
    var req = createXMLHTTPObject();
    if (req) {
        try {
            req.open('GET', url, false);
            req.send(null);
            return req.responseText;
        } catch (e) {
        }
    }
    return '';
}

Ini ... sepertinya hanya untuk XHR, bukan unduhan file? Saya tidak melihat relevansinya di sini.
Mark Amery

0

Saya sarankan Anda menggunakan acara mousedown, yang disebut SEBELUM acara klik. Dengan begitu, browser menangani acara klik secara alami, yang menghindari keanehan kode:

(function ($) {


    // with this solution, the browser handles the download link naturally (tested in chrome and firefox)
    $(document).ready(function () {

        var url = '/private/downloads/myfile123.pdf';
        $("a#someID").on('mousedown', function () {
            $(this).attr("href", url);
        });

    });
})(jQuery);

0

Solusi Excelent dari Corbacho, saya baru saja beradaptasi untuk menyingkirkan var

function downloadURL(url) {
    if( $('#idown').length ){
        $('#idown').attr('src',url);
    }else{
        $('<iframe>', { id:'idown', src:url }).hide().appendTo('body');
    }
}

0

Firefox dan Chrome diuji:

var link = document.createElement('a');
link.download = 'fileName.ext'
link.href = 'http://down.serv/file.ext';

// Because firefox not executing the .click() well
// We need to create mouse event initialization.
var clickEvent = document.createEvent("MouseEvent");
clickEvent.initEvent("click", true, true);

link.dispatchEvent(clickEvent);

Ini sebenarnya adalah solusi cara "chrome" untuk firefox (saya tidak mengujinya di browser lain, jadi silakan tinggalkan komentar tentang kompilabilitas)


0

Ada begitu banyak hal kecil yang dapat terjadi ketika mencoba mengunduh file. Ketidakkonsistenan antara browser saja adalah mimpi buruk. Saya akhirnya menggunakan perpustakaan kecil yang hebat ini. https://github.com/rndme/download

Yang menyenangkan tentang itu adalah fleksibel untuk tidak hanya url tetapi untuk data sisi klien yang ingin Anda unduh.

  1. string teks
  2. data teksURL
  3. gumpalan teks
  4. array teks
  5. string html
  6. html gumpalan
  7. panggilan balik ajax
  8. file biner

-1

Menggunakan tag jangkar dan PHP itu bisa dilakukan, Periksa jawaban ini

JQuery Ajax call untuk mengunduh file PDF

HTML
    <a href="www.example.com/download_file.php?file_source=example.pdf">Download pdf here</a>

PHP
<?php
$fullPath = $_GET['fileSource'];
if($fullPath) {
    $fsize = filesize($fullPath);
    $path_parts = pathinfo($fullPath);
    $ext = strtolower($path_parts["extension"]);
    switch ($ext) {
        case "pdf":
        header("Content-Disposition: attachment; filename=\"".$path_parts["basename"]."\""); // use 'attachment' to force a download
        header("Content-type: application/pdf"); // add here more headers for diff. extensions
        break;
        default;
        header("Content-type: application/octet-stream");
        header("Content-Disposition: filename=\"".$path_parts["basename"]."\"");
    }
    if($fsize) {//checking if file size exist
      header("Content-length: $fsize");
    }
    readfile($fullPath);
    exit;
}
?>

Saya memeriksa ukuran file karena jika Anda memuat pdf dari CDN cloudfront, Anda tidak akan mendapatkan ukuran dokumen yang memaksa dokumen untuk mengunduh dalam 0kb, Untuk menghindari hal ini saya memeriksa dengan kondisi ini

 if($fsize) {//checking if file size exist
      header("Content-length: $fsize");
    }

-1

Saya tahu saya terlambat ke pesta, tetapi saya ingin membagikan solusi saya yang merupakan variasi dari solusi Imagine Breaker di atas. Saya mencoba menggunakan solusinya, karena solusinya tampaknya paling sederhana dan mudah bagi saya. Tapi seperti kata yang lain, itu tidak bekerja untuk beberapa browser, jadi saya menaruh beberapa variasi di atasnya dengan menggunakan jquery.

Semoga ini bisa membantu seseorang di luar sana.

function download(url) {
  var link = document.createElement("a");
  $(link).click(function(e) {
    e.preventDefault();
    window.location.href = url;
  });
  $(link).click();
}

Seluruh fungsi tubuh ini hanyalah cara yang terlalu rumit untuk dilakukan window.location.href = url. Tautan yang Anda buat tidak digunakan untuk apa pun.
Mark Amery

-1

Catatan: Tidak didukung di semua browser.

Saya sedang mencari cara untuk mengunduh file menggunakan jquery tanpa harus mengatur url file di atribut href dari awal.

jQuery('<a/>', {
    id: 'downloadFile',
    href: 'http://cdn.sstatic.net/Sites/stackoverflow/img/apple-touch-icon@2.png',
    style: 'display:hidden;',
    download: ''
}).appendTo('body');

$("#downloadFile")[0].click();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>


-1

Saya menggunakan solusi @ rakaloof tanpa JQuery (karena Anda tidak membutuhkannya di sini ). Terima kasih atas idenya! Berikut ini adalah solusi berbasis form vanillaJS:

const uri = 'https://upload.wikimedia.org/wikipedia/commons/b/bb/Test_ogg_mp3_48kbps.wav';
let form = document.createElement("form");
form.setAttribute('action', uri);
document.body.appendChild(form);
form.submit();
document.body.removeChild(document.body.lastElementChild);

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.