Pobierz plik za pomocą Javascript / jQuery


357

Mam bardzo podobny wymóg określony tutaj .

Potrzebuję, aby przeglądarka użytkownika rozpoczęła pobieranie ręcznie, kiedy $('a#someID').click();

Ale nie mogę użyć tej window.hrefmetody, ponieważ zastępuje ona zawartość bieżącej strony plikiem, który próbujesz pobrać.

Zamiast tego chcę otworzyć plik do pobrania w nowym oknie / karcie. Jak to jest możliwe?


Próbowałem wielu odpowiedzi w powiązanych pytaniach i to jest ostateczna odpowiedź .
Basj

Ustawienie window.location.href działa dla mnie. Również zawartość okna NIE ulega zmianie. Zakładam, że użyłeś niewłaściwego contentType?
BluE

Odpowiedzi:


379

Użyj niewidzialnego <iframe>:

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

Aby zmusić przeglądarkę do pobrania pliku, który w innym przypadku byłby w stanie renderować (np. HTML lub pliki tekstowe), potrzebujesz, aby serwer ustawił typ MIME pliku na bezsensowną wartość, taką jak application/x-please-download-melub alternatywnie application/octet-stream, która jest używana dla dowolnego pliku binarnego dane.

Jeśli chcesz otworzyć go tylko w nowej karcie, jedynym sposobem na to jest kliknięcie linku z targetustawionym atrybutem _blank.

W jQuery:

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

Każde kliknięcie tego łącza spowoduje pobranie pliku w nowej karcie / oknie.


4
Strona internetowa nie może automatycznie otworzyć nowej karty. Aby zmusić przeglądarkę do pobrania, poproś serwer, aby wysłał plik pdf z nonsensownym typem MIME, takim jak application / x-please-download-me
Randy the Dev

14
Ładnie wykonane! Dobrze rozwiązuje problem. Możesz jednak użyć: iframe.style.display = 'none'; ponieważ to całkowicie ukryje ramkę iframe. Twoja obecna implementacja sprawi, że iframe będzie niewidoczny, ale iframe nadal będzie zajmować miejsce na dole strony, powodując dodatkowe białe spacje.
Akrikos,

2
„Semi” działa dla mnie. Utworzyłem następujący prosty testowy HTML: <html> <body> <iframe src = "fileurl"> </iframe> </body> </html> i jest pobierany, ale w konsoli Chrome widzę, że pobieranie został „anulowany” i pojawia się na czerwono. Jest to część większej mobilnej aplikacji internetowej, a fakt jej anulowania powoduje uszkodzenie aplikacji, ponieważ powoduje ogólną awarię sieci. Jakiś sposób na to?
Sagi Mann

27
Niezły fragment. Jednak ustawienie nonsensownego rodzaju rzeczy jest nieco niepokojące. Aby poprosić przeglądarkę o pobranie pliku, który może renderować, użyj następującego nagłówka: Content-Disposition: attachment; filename="downloaded.pdf"(możesz oczywiście dostosować nazwę pliku według potrzeb).
rixo

2
Jak wymusić pobieranie bez serwera? Więc tylko strona HTML z jakimś javascript.
Rodrigo Ruiz,

221

Aktualizacja nowoczesnych przeglądarek 2019

Takie podejście polecam teraz z kilkoma zastrzeżeniami:

  • Wymagana jest stosunkowo nowoczesna przeglądarka
  • Jeśli plik ma być bardzo duży , prawdopodobnie powinieneś zrobić coś podobnego do oryginalnego podejścia (iframe i cookie), ponieważ niektóre z poniższych operacji mogą prawdopodobnie zajmować pamięć systemową co najmniej tak dużą, jak pobierany plik i / lub inny interesujący procesor skutki uboczne.

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 oryginalne podejście oparte na jQuery / iframe / cookie

Stworzyłem wtyczkę jQuery File Download ( Demo ) ( GitHub ), która może również pomóc w twojej sytuacji. Działa dość podobnie z ramką iframe, ale ma kilka fajnych funkcji, które znalazłem całkiem przydatne:

  • Bardzo łatwa w konfiguracji z ładnymi efektami wizualnymi (okno dialogowe jQuery UI, ale nie jest wymagana), wszystko jest również testowane

  • Użytkownik nigdy nie opuszcza tej samej strony, z której zainicjował pobieranie pliku. Ta funkcja staje się kluczowa dla nowoczesnych aplikacji internetowych

  • Funkcje SuccessCallback i failCallback umożliwiają wyraźne określenie tego, co użytkownik widzi w obu sytuacjach

  • W połączeniu z interfejsem jQuery programista może łatwo pokazać modal informujący użytkownika, że ​​ma miejsce pobieranie pliku, rozwiązać modal po rozpoczęciu pobierania, a nawet poinformować użytkownika w przyjazny sposób, że wystąpił błąd. Zobacz Demo, aby zobaczyć przykład tego. Mam nadzieję, że to komuś pomoże!

Oto prosta wersja demonstracyjna przypadku użycia źródła wtyczek z obietnicami. Strona demonstracyjna zawiera również wiele innych przykładów „lepszego UX”.

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

@JohnCulviner: czy mogę wysłać dane JSON w metodzie postu. Wypróbowałem to i nie udało mi się. Czy możesz podać mi próbkę
Saravanan,

Czy można przekazać parametry do połączenia? powiedzmy, że muszę przekazać kilka identyfikatorów, aby serwer mógł wygenerować plik, który chcę pobrać. Jak to zrobić? dzięki
omer schleifer

Zrobiłem 100. Głosowanie. Dziękuję za poświęcony czas - jest to naprawdę cenne. Rozważ umieszczenie linku PayPal do darowizn. Oddałbym
Stephan Schinkel

Próbowałem, ale wywołania zwrotne nigdy nie są wykonywane. Wtyczka po prostu otworzy odpowiedź usługi w nowej karcie, nawet jeśli usługa zwróci błąd. Nie chcę, aby aplikacja otworzyła nową kartę i wyświetliła odpowiedź usługi po zgłoszeniu błędu. Dodałem nawet plik cookie, aby wskazać, że plik jest zgodny z prawdą i fałszem w przypadku powodzenia i niepowodzenia, ale odpowiedź wciąż otwiera się w nowej karcie .. w jakikolwiek sposób to naprawić .. Używam metody get.
Vishal Gulati,

1
@ MarkAmery, który działa również tak, jak wskazały inne odpowiedzi. Takie podejście (AFAIK) nie daje informacji zwrotnej o tym, kiedy pobieranie się rozpoczyna, kiedy jest ukończone i czy jest błędne, co jest przydatne. Mógłbym dodać to do odpowiedzi dla opcji „odpal i zapomnij”. Również atrybut [download] nie pozwala na POST ani na żadne inne egzotyki.
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();
}

Sprawdź, czy docelowe przeglądarki będą płynnie uruchamiać powyższy fragment kodu:
http://caniuse.com/#feat=download


1
pobierz nazwę pliku nie zmienił się ... przetestowano w chromie w kwietniu 2015 r.
Novellizator

7
Dla mnie byłoby to idealne, ale nie działa również w Firefoksie. Dowolny pomysł?
g07kore

2
Jak wspomniano w caniuse.com/#feat=download , działa to tylko w przypadku łączy tego samego pochodzenia w najnowszych wydaniach Firefox i Chrome. Więc jeśli twoje linki wskazują na inną domenę, na razie prawie nie działa.
jean-baptiste

9
Aby działał w przeglądarce Firefox, wykonaj document.body.appendChild(link)przed kliknięciem, a po kliknięciu możesz zrobić, link.remove()aby nie zanieczyścić DOM.
Okku,

1
Możesz także zrobić, link.download = ""aby zachowała oryginalną nazwę pliku i uniknąć konieczności ustawiania.
Okku

69

Dziwi mnie, że niewiele osób wie o atrybucie pobierania elementów. Pomóżcie rozpowszechnić informacje na ten temat! Możesz mieć ukryty link HTML i sfałszować kliknięcie. Jeśli link HTML ma atrybut pobierania, pobiera plik, a nie wyświetla go, bez względu na wszystko. Oto kod. Pobiera zdjęcie kota, jeśli może je znaleźć.

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

Uwaga: To nie jest obsługiwane we wszystkich przeglądarkach: http://www.w3schools.com/tags/att_a_download.asp


12
Nieobsługiwany w przeglądarkach IE i Safari
MatPag

9
Chrome pobiera, ale Firefox po prostu pokazuje obraz.
Saran

+1 za udostępnienie tego pliku wykonywalnego. Zaoszczędził mi czas na przetestowanie go tylko po to, aby dowiedzieć się, czy to nie zadziała.
Doopy

4
Najnowszy Chrome (sierpień 2018 r.) Również pokazuje obraz (z powodu absurdalnych ograniczeń bezpieczeństwa), więc nie
działa

Chrome nie pobiera dla mp4s
Nearoo,

53

Polecam stosując ten downloadatrybut do pobrania zamiast jQuery:

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

Spowoduje to pobranie pliku bez otwierania go.


5
Będzie obsługiwał tylko Chrome, Firefox, Opera i IE (> = 13,0)
Kunal Kakkad,

Edge> = 13, nie IE. Również implementacje Edge 13 są błędne, ponieważ nazwa pliku jest ignorowana, a zamiast tego otrzymujesz plik o identyfikatorze jako nazwie.
David

8
Moim zdaniem jest to poprawna odpowiedź na pytanie. Inne odpowiedzi mają sens, jeśli musisz obsługiwać starsze przeglądarki i potrzebujesz obejścia.
crabCRUSHERclamCOLLECTOR

19

Jeśli już używasz jQuery, możesz z niego skorzystać, aby stworzyć mniejszy fragment
A jQuery wersja odpowiedzi 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');

Do Twojej wiadomości, ktoś zasugerował (poprzez edycję mojego postu), aby dodać $ idown.attr ('src', url); po utworzeniu iframe po raz pierwszy. Nie sądzę, że jest to potrzebne. Już teraz ustawia „src: url” na etapie tworzenia.
corbacho

Aby również skomentować, że w końcu nie skorzystałem z tego rozwiązania, ponieważ IE 9 nie lubił dynamicznie tworzonych ramek iframe wskazujących na http: //, gdy jesteś w sieci https. Musiałem użyć „window.location.href”, rozwiązania, które ma również pewne niedogodności
corbacho

część „if ($ idown)” nie działała dla mnie w najnowszym Chrome (24), ale wystarczyło utworzenie nieskończonej liczby iframe. Może dlatego, że chciałem pobrać 12 rzeczy jednocześnie?
nessur

6
ifOświadczenie naprawdę powinno być:if( $idown && $idown.length > 0 )
iOnline247

3
Nic nie robi w Chrome
jjxtra

11

Działa w Chrome, Firefox i IE8 i nowszych.

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

Działa to również, jeśli nie dołączasz linku do DOM.
Johnie Karr

O ile nagłówki zwrócone z serwera nie wskazują inaczej, po prostu przejdzie do url, a nie pobierze z niego.
Mark Amery

10

Prosty przykład z użyciem 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;
};

Następnie wystarczy wywołać funkcję w dowolnym miejscu:

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


10

Może to być pomocne, jeśli nie musisz nawigować po innej stronie. Jest to podstawowa funkcja javascript, więc można jej używać na dowolnej platformie, w której backend znajduje się w JavaScript

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

Jest to prawdopodobnie najłatwiejsze rozwiązanie, jeśli możesz samodzielnie ustawić contentType. Używam go jako: window.location.href = downloadFileUrl;
BluE

Jeśli administrator nie chce pokazywać użytkownikowi adresu URL?
Naren Verma

9

Zaledwie siedem lat później pojawia się jedno-wierszowe rozwiązanie jQuery przy użyciu formularza zamiast elementu iframe lub linku:

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

Przetestowałem to w

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

Jeśli ktoś wie o jakichkolwiek wadach tego rozwiązania, bardzo chętnie o nich usłyszę.


Pełna wersja demo:

<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
To nie działa, jeśli masz filePathkwerendę, ponieważ przesłanie formularza spowoduje zastąpienie kwerendy w atrybucie akcji.
Bobort

1
Obejrzałem to, dodając dane wejściowe do formularza: var authInput = $("<input>").attr("type", "hidden").attr("name", "myQsKey").val('MyQsValue'); $('<form></form>') .attr('action', filePath) .append($(authInput)) .appendTo('body').submit().remove();Jest to równoważny dostęp:filepath?myQsKey=myValue
Harald Hoerwick

To również zamyka gniazda sieciowe.
radu122,

2
Wygląda to bardzo skomplikowany sposób ustawić window.locationdo filePath. Po prostu window.location = filePath;zrobiłbym to samo.
Ivo Smits

Niezależnie od tego, czy jest to wada tego rozwiązania, samo w sobie nie dostarczyłeś żadnych zalet korzystania z tego łącza. (I jest wada: nie można użyć tego downloadatrybutu, aby powiedzieć przeglądarce, że chcesz pobrać, niezależnie od nagłówków zwracanych przez serwer, co możesz zrobić z aelementem.)
Mark Amery

5

Nie wiem, czy pytanie jest po prostu zbyt stare, ale ustawienie window.location do adresu URL pobierania będzie działać, o ile typ mime pobierania jest prawidłowy (na przykład archiwum zip).

var download = function(downloadURL) {

   location = downloadURL;

});

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

5

Skończyło się na tym, że użyłem poniższego fragmentu i działa on w większości przeglądarek, ale nie był testowany w IE.

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

Aktualizacja

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);
}

Jaki jest sens korzystania MouseEventtutaj zamiast korzystania zawsze click? I dlaczego dołączyć link do dokumentu przed jego kliknięciem? Może ma to przewagę nad prostszym podejściem przedstawionym w stackoverflow.com/a/23013574/1709587 , ale jeśli tak, to nie zostaną tutaj wyjaśnione.
Mark Amery

Już dawno opublikowałem tę odpowiedź. Nie pamiętam, czy kryje się za tym jakiś niepotrzebny wiersz kodu.
Abk

3

Aby poprawić odpowiedź Imagine Breaker, jest to obsługiwane w FF i 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);
}

Innymi słowy, po prostu użyj dispatchEventfunkcji zamiast click();


Jak to jest poprawa? Wydaje się, że jest to po prostu bardziej skomplikowany sposób robienia tego samego.
Mark Amery

3

Może po prostu w javascript otworzy się strona, która po prostu pobiera plik, na przykład po przeciągnięciu łącza pobierania do nowej karty:

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

Przy otwartym oknie otwórz stronę pobierania, która zamyka się automatycznie.


1
Spowoduje to utworzenie wyskakującego okna, które większość przeglądarek blokuje
Ashton Wiersdorf,

3

Następuje najbardziej kompletny i działający (przetestowany) kod do pobierania danych do FireFox, Chrome i kodu IE. Załóżmy, że Dane znajdują się w polu texarea , które ma id = 'textarea_area', a nazwa pliku to nazwa pliku, do którego dane zostaną pobrane.

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

}

a potem po prostu zadzwoń

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

Do pobrania Inicjowanie.

Tablica do ustawiania prawidłowego typu MIME dla okna pobierania MOŻE BYĆ następująca:

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

- Próbowałem tego z plikami pdf. Plik jest pobierany, ale zawsze jest uszkodzony. Jakieś sugestie? Dziękuję
Shrivaths Kulkarni

2

dla mnie to działa ok przetestowane w 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')

Jest to takie samo podejście, jak pokazane w odpowiedzi Imagine Breaker lata wcześniej, ale z dodatkową wadą wymaganą przez jQuery.
Mark Amery

1

Korzystam z tagu FORM, ponieważ działa on wszędzie i nie trzeba tymczasowo tworzyć plików na serwerze. Metoda działa w ten sposób.

Po stronie klienta (strona HTML) tworzysz taką niewidoczną formę jak ta

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

Następnie dodajesz ten kod JavaScript do swojego przycisku:

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

Po stronie serwera masz następujący kod PHP 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();

Możesz nawet utworzyć pliki zip swoich danych w następujący sposób:

<?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); 

Najlepsze jest to, że nie pozostawia żadnych plików na serwerze, ponieważ wszystko jest tworzone i niszczone w locie!


0

Odpowiedź przekazana przez hitesh w dniu 30 grudnia 13 faktycznie działa. Wymaga tylko niewielkiego dostosowania:

Plik PHP może się nazywać sam. Innymi słowy, po prostu utwórz plik o nazwie saveAs.php i umieść w nim ten kod ...

        <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

Te funkcje są używane w pliku 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 '';
}

To ... wydaje się, że dotyczy tylko XHR, a nie pobierania plików? Nie widzę tu znaczenia.
Mark Amery

0

Sugeruję użycie zdarzenia mousedown, które nazywa się PRZED zdarzeniem kliknięcia. W ten sposób przeglądarka naturalnie obsługuje zdarzenie click, co pozwala uniknąć dziwnego kodu:

(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

Doskonałe rozwiązanie od Corbacho, właśnie dostosowałem się, aby pozbyć się var

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

0

Testowane przeglądarki Firefox i Chrome:

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);

To jest właściwie „chromowane” rozwiązanie dla Firefoxa (nie testowałem go w innych przeglądarkach, więc proszę zostawić komentarz na temat kompatybilności)


0

Jest tak wiele małych rzeczy, które mogą się zdarzyć podczas próby pobrania pliku. Niespójność między przeglądarkami to koszmar. Skończyło się na użyciu tej wspaniałej małej biblioteki. https://github.com/rndme/download

Zaletą jest to, że jest elastyczny nie tylko dla adresów URL, ale także dla danych po stronie klienta, które chcesz pobrać.

  1. Ciąg tekstowy
  2. dane tekstoweURL
  3. kropelka tekstu
  4. tablice tekstowe
  5. ciąg HTML
  6. kropelka HTML
  7. oddzwonienie ajax
  8. pliki binarne

-1

Można to zrobić za pomocą tagu kotwicy i PHP. Sprawdź tę odpowiedź

Wywołanie JQuery Ajax w celu pobrania pliku 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;
}
?>

Sprawdzam rozmiar pliku, ponieważ jeśli załadujesz pdf z CDN Cloudfront, nie dostaniesz rozmiaru dokumentu, który zmusi dokument do pobrania w 0kb. Aby tego uniknąć sprawdzam ten warunek

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

-1

Wiem, że spóźniłem się na przyjęcie, ale chciałbym podzielić się moim rozwiązaniem, które jest odmianą powyższego rozwiązania Imagine Breaker. Próbowałem użyć jego rozwiązania, ponieważ jego rozwiązanie wydaje mi się najprostsze i najłatwiejsze. Ale jak inni mówili, nie działało to w niektórych przeglądarkach, więc wprowadziłem pewne zmiany, używając jquery.

Mam nadzieję, że to może pomóc komuś tam.

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

Całe to ciało funkcji jest po prostu nadmiernie skomplikowanym sposobem window.location.href = url. Utworzony link nie jest do niczego używany.
Mark Amery

-1

Uwaga: Nie obsługiwane we wszystkich przeglądarkach.

Szukałem sposobu pobrania pliku przy użyciu jquery bez konieczności ustawiania adresu URL pliku w atrybucie href od samego początku.

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

Używam rozwiązania @ rakaloof bez JQuery (ponieważ nie potrzebujesz go tutaj ). Dziękuję za pomysł! Oto rozwiązanie oparte na formularzu 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);

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.