Tải xuống tệp bằng Javascript / jQuery


357

Tôi có một yêu cầu rất giống được chỉ định ở đây .

Tôi cần để trình duyệt của người dùng bắt đầu tải xuống theo cách thủ công khi $('a#someID').click();

Nhưng tôi không thể sử dụng window.hrefphương thức này, vì nó thay thế nội dung trang hiện tại bằng tệp bạn đang cố tải xuống.

Thay vào đó tôi muốn mở tải xuống trong cửa sổ / tab mới. Sao có thể như thế được?


Tôi đã thử nhiều câu trả lời trong các câu hỏi liên quan, và đây là câu trả lời dứt khoát .
Basj

Cài đặt window.location.href hoạt động với tôi. Ngoài ra nội dung cửa sổ KHÔNG thay đổi. Tôi giả sử bạn đã sử dụng nội dung sai?
BluE

Câu trả lời:


379

Sử dụng vô hình <iframe>:

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

Để buộc trình duyệt tải xuống một tệp, nếu không nó sẽ có khả năng hiển thị (chẳng hạn như tệp HTML hoặc tệp văn bản), bạn cần máy chủ đặt Loại MIME của tệp thành giá trị vô nghĩa, như application/x-please-download-mehoặc thay thế application/octet-stream, được sử dụng cho nhị phân tùy ý dữ liệu.

Nếu bạn chỉ muốn mở nó trong một tab mới, cách duy nhất để làm điều này là cho người dùng nhấp vào liên kết với targetthuộc tính được đặt thành _blank.

Trong jQuery:

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

Bất cứ khi nào liên kết đó được nhấp, nó sẽ tải tệp trong một tab / cửa sổ mới.


4
Một trang web không thể tự động mở một tab mới. Để buộc trình duyệt tải xuống, hãy yêu cầu máy chủ gửi tệp pdf với loại MIME vô nghĩa, chẳng hạn như application / x-Please-download-me
Randy the Dev

14
Làm tốt lắm! Giải quyết tốt vấn đề. Tuy nhiên, bạn có thể muốn sử dụng: iframe.style.display = 'none'; vì điều này sẽ ẩn hoàn toàn iframe. Việc triển khai hiện tại của bạn sẽ làm cho iframe trở nên vô hình, nhưng iframe vẫn sẽ chiếm dung lượng ở cuối trang gây thêm khoảng trắng.
Akrikos

2
Nó "bán" hoạt động cho tôi. Tôi đã tạo html thử nghiệm đơn giản sau: <html> <body> <iframe src = "fileurl"> </ iframe> </ body> </ html> và nó được tải xuống, nhưng trong bảng điều khiển chrome tôi thấy rằng tải xuống đã bị "hủy bỏ" và xuất hiện trong màu đỏ. Đây là một phần của một ứng dụng web di động lớn hơn và thực tế là nó bị hủy sẽ phá vỡ ứng dụng vì nó gây ra lỗi web nói chung. Có cách nào khác không?
Sagi Mann

27
Đoạn trích hay. Tuy nhiên, thiết lập một loại điều vô nghĩa là một chút đáng lo ngại. Để yêu cầu trình duyệt tải xuống một tệp mà nó có thể kết xuất, hãy sử dụng tiêu đề sau: Content-Disposition: attachment; filename="downloaded.pdf"(tất nhiên bạn có thể tùy chỉnh tên tệp khi bạn cần).
rixo

2
Làm cách nào để buộc tải xuống mà không có máy chủ? Vì vậy, chỉ cần một trang html với một số javascript.
Rodrigo Ruiz

221

Cập nhật trình duyệt hiện đại 2019

Đây là cách tiếp cận mà tôi muốn giới thiệu với một vài cảnh báo:

  • Cần có một trình duyệt tương đối hiện đại.
  • Nếu tệp được dự kiến ​​là rất lớn, bạn có thể sẽ làm một cái gì đó tương tự như cách tiếp cận ban đầu (iframe và cookie) vì một số thao tác dưới đây có thể tiêu thụ bộ nhớ hệ thống ít nhất bằng với tệp được tải xuống và / hoặc CPU thú vị khác phản ứng phụ.

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

Cách tiếp cận dựa trên jQuery / iframe / cookie ban đầu năm 2012

Tôi đã tạo plugin Tải xuống tệp jQuery ( Demo ) ( GitHub ) cũng có thể giúp giải quyết tình huống của bạn. Nó hoạt động khá giống với iframe nhưng có một số tính năng thú vị mà tôi thấy khá tiện dụng:

  • Rất dễ cài đặt với hình ảnh đẹp (Hộp thoại UI UI, nhưng không bắt buộc), mọi thứ cũng được kiểm tra

  • Người dùng không bao giờ rời khỏi cùng một trang mà họ đã bắt đầu tải xuống tệp từ đó. Tính năng này đang trở nên quan trọng đối với các ứng dụng web hiện đại

  • Các hàm thành công và ngược lại cho phép bạn rõ ràng về những gì người dùng nhìn thấy trong cả hai trường hợp

  • Kết hợp với jQuery UI, nhà phát triển có thể dễ dàng hiển thị một phương thức cho người dùng biết rằng việc tải xuống tệp đang xảy ra, giải tán phương thức sau khi quá trình tải xuống bắt đầu hoặc thậm chí thông báo cho người dùng một cách thân thiện rằng đã xảy ra lỗi. Xem bản Demo cho một ví dụ về điều này. Hy vọng điều này sẽ giúp được ai đó!

Dưới đây là một bản demo trường hợp sử dụng đơn giản bằng cách sử dụng nguồn plugin với lời hứa. Các trang demo bao gồm nhiều người khác, 'tốt hơn UX' ví dụ là tốt.

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

@JohnCulviner: tôi có thể gửi dữ liệu json trong phương thức đăng bài của bạn không. Tôi đã thử nó và thất bại. Bạn có thể cho tôi mẫu
Saravanan

Có thể truyền tham số cho cuộc gọi? hãy nói rằng tôi cần phải vượt qua một số id để máy chủ tạo tệp tôi muốn tải xuống, làm thế nào để tôi làm điều đó? cảm ơn
omer schleifer 10/03/2015

Đã thực hiện 100. Upvote. Cảm ơn thời gian của bạn - điều này thực sự có giá trị. Hãy xem xét đưa một liên kết PayPal lên để quyên góp. Tôi đã có thể quyên góp.
Stephan Schinkel

Tôi đã thử nó nhưng các cuộc gọi lại không bao giờ thực hiện. Trình cắm sẽ chỉ mở phản hồi dịch vụ trong tab mới ngay cả khi dịch vụ bị lỗi. Tôi không muốn ứng dụng mở tab mới và hiển thị phản hồi dịch vụ khi lỗi được đưa ra. Tôi thậm chí đã thêm cookie để chỉ ra tải xuống đúng và sai khi thành công và thất bại nhưng vẫn có phản hồi đang mở trong tab mới .. mọi cách để khắc phục điều này .. Tôi đang sử dụng phương thức get.
Vishal Gulati

1
@MarkAmery hoạt động quá như các câu trả lời khác đã chỉ ra. Cách tiếp cận đó (AFAIK) không cung cấp cho bạn thông tin phản hồi về thời điểm tải xuống bắt đầu, khi hoàn thành và nếu nó bị lỗi thì tiện dụng. Tôi có thể thêm nó vào câu trả lời cho tùy chọn "lửa và quên". Ngoài ra, thuộc tính [download] không cho phép POST hoặc bất cứ thứ gì kỳ lạ.
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();
}

Kiểm tra xem (các) trình duyệt mục tiêu của bạn có chạy trơn tru đoạn trích trên không:
http://caniuse.com/#feat=doad


1
tên tệp tải xuống không thay đổi ... đã được thử nghiệm trong chrome vào tháng 4 năm 2015
Novellizator

7
Đối với tôi điều này sẽ hoàn hảo nhưng nó cũng không hoạt động trên Firefox. Bất kỳ ý tưởng?
g07kore

2
Như đã đề cập trong caniuse.com/#feat=d Download , điều này chỉ hoạt động đối với các liên kết có cùng nguồn gốc trên các bản phát hành Firefox và Chrome gần đây. Vì vậy, nếu các liên kết của bạn trỏ đến một tên miền khác, bây giờ nó hầu như không hoạt động.
jean-baptiste

9
Để nó hoạt động trên Firefox, hãy thực hiện document.body.appendChild(link)trước khi nhấp và sau khi nhấp bạn có thể làm link.remove()để tránh gây ô nhiễm DOM.
Okku

1
Bạn cũng có thể làm link.download = ""để giữ lại tên tệp gốc và tránh phải đặt tên.
Okku

69

Tôi ngạc nhiên không nhiều người biết về thuộc tính tải xuống cho một yếu tố. Xin hãy giúp truyền bá về nó! Bạn có thể có một liên kết html ẩn và giả mạo nhấp chuột vào nó. Nếu liên kết html có thuộc tính tải xuống, nó sẽ tải tệp xuống, không xem nó, không có vấn đề gì. Đây là mã. Nó sẽ tải xuống một hình ảnh con mèo nếu nó có thể tìm thấy nó.

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

Lưu ý: Điều này không được hỗ trợ trên tất cả các trình duyệt: http://www.w3schools.com/tags/att_a_doad.asp


12
Không được hỗ trợ trong IE và Safari
MatPag

9
Tải xuống Chrome, nhưng Firefox chỉ hiển thị hình ảnh.
Saran

+1 để cung cấp đoạn mã thực thi đó mặc dù. Tiết kiệm cho tôi thời gian để kiểm tra nó chỉ để tìm ra nó sẽ không hoạt động.
Doopy

4
Chrome mới nhất (tháng 8 năm 2018) cũng hiển thị hình ảnh (vì hạn chế bảo mật vô lý) nên không thành công
user1156544

Chrome không tải xuống cho mp4s
Nearoo

53

Tôi khuyên bạn nên sử dụng các downloadthuộc tính để tải về thay vì jQuery:

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

Điều này sẽ tải tập tin của bạn, mà không cần mở nó.


5
Nó sẽ chỉ hỗ trợ Chrome, Firefox, Opera và IE (> = 13.0)
Kunal Kakkad

Cạnh> = 13, không phải IE. Ngoài ra, việc triển khai Edge 13 bị lỗi vì tên của tệp bị bỏ qua và thay vào đó bạn nhận được một tệp có id là tên.
David

8
Theo tôi, đây là câu trả lời chính xác cho câu hỏi. Các câu trả lời khác có ý nghĩa nếu bạn phải hỗ trợ các trình duyệt cũ hơn và cần một cách giải quyết.
CrabCRUSHERclamCOLLECTOR

19

Nếu bạn đã sử dụng jQuery, bạn có thể sử dụng nó để tạo ra một đoạn nhỏ hơn
Một phiên bản jQuery của câu trả lời của 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, Ai đó đã đề xuất (thông qua chỉnh sửa bài đăng của tôi) để thêm $ idown.attr ('src', url); sau khi tạo iframe lần đầu tiên. Tôi không nghĩ là cần thiết. Nó đã thiết lập 'src: url' trong bước tạo.
corbacho

Ngoài ra, để nhận xét rằng cuối cùng tôi đã không sử dụng giải pháp này vì IE 9 không thích các iframe được tạo động chỉ vào http: // khi bạn ở trong web https. Tôi đã phải sử dụng "window.location.href", một giải pháp cũng có một số bất tiện
corbacho

phần "if ($ idown)" không hoạt động với tôi trong Chrome mới nhất (24), nhưng chỉ tạo ra vô số iframe đã làm. Có lẽ bởi vì tôi muốn tải xuống 12 thứ cùng một lúc?
nessur

6
Các iftuyên bố thực sự cần là:if( $idown && $idown.length > 0 )
iOnline247

3
Không làm gì trong Chrome
jjxtra

11

Hoạt động trên Chrome, Firefox và IE8 trở lên.

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

Điều này cũng hoạt động nếu bạn không nối thêm liên kết đến DOM.
Johnie Karr

Trừ khi các tiêu đề được trả về từ máy chủ biểu thị để làm khác, điều này chỉ đơn giản là điều hướng đến url, không tải xuống từ nó.
Mark Amery

10

Ví dụ đơn giản sử dụng một 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;
};

Sau đó, chỉ cần gọi chức năng bất cứ nơi nào bạn muốn:

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


10

Điều này có thể hữu ích nếu bạn không cần phải điều hướng một trang khác. Đây là chức năng javascript cơ bản, vì vậy có thể được sử dụng trong bất kỳ nền tảng nào có phụ trợ trong Javascript

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

Đây có lẽ là giải pháp đơn giản nhất nếu bạn có thể tự đặt nội dung. Tôi sử dụng nó như: window.location.href = downloadFileUrl;
BluE

Nếu quản trị viên không muốn hiển thị URL cho người dùng hơn?
Naren Verma

9

Chỉ bảy năm sau, ở đây có một giải pháp jQuery một dòng bằng cách sử dụng một biểu mẫu thay vì iframe hoặc liên kết:

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

Tôi đã thử nghiệm điều này trong

  • Chrome 55
  • Firefox 50
  • Cạnh IE8-10
  • iOS 10 (Safari / Chrome)
  • Chrome Chrome

Nếu bất cứ ai biết về bất kỳ nhược điểm nào với giải pháp này, tôi sẽ rất vui khi nghe về chúng.


Bản demo đầy đủ:

<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
Điều này không hoạt động nếu bạn filePathcó một chuỗi truy vấn vì việc gửi biểu mẫu sẽ ghi đè lên chuỗi truy vấn trong thuộc tính hành động.
Bobort

1
Tôi đã khắc phục điều này bằng cách thêm một đầu vào vào biểu mẫu: var authInput = $("<input>").attr("type", "hidden").attr("name", "myQsKey").val('MyQsValue'); $('<form></form>') .attr('action', filePath) .append($(authInput)) .appendTo('body').submit().remove();Đây là sự tương đương:filepath?myQsKey=myValue
Harald Hoerwick

Điều này cũng đóng các websockets.
radu122

2
Đây trông giống như một cách thực sự phức tạp để thiết lập window.locationđể filePath. Chỉ cần window.location = filePath;làm như vậy.
Ivo Smits

Cho dù có một nhược điểm để giải pháp này, mỗi gia nhập, bạn chưa cung cấp bất kỳ lộn ngược để sử dụng này trên một liên kết. (Và có một nhược điểm: bạn không thể sử dụng downloadthuộc tính theo cách này để nói với trình duyệt rằng bạn muốn tải xuống bất kể tiêu đề nào mà máy chủ trả về, bạn có thể làm gì với một ayếu tố.)
Đánh dấu

5

Tôi không biết nếu câu hỏi đã quá cũ, nhưng cài đặt window.location thành url tải xuống sẽ hoạt động, miễn là loại mime tải xuống là chính xác (ví dụ: lưu trữ zip).

var download = function(downloadURL) {

   location = downloadURL;

});

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

5

Tôi đã kết thúc bằng đoạn mã dưới đây và nó hoạt động trong hầu hết các trình duyệt, mặc dù không được thử nghiệm trong 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();
}

Cập nhật

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

Điểm của việc sử dụng MouseEventở đây thay vì luôn luôn sử dụng là clickgì? Và tại sao nối các liên kết đến tài liệu trước khi nhấp vào nó? Có thể điều này có lợi thế so với cách tiếp cận đơn giản hơn được hiển thị trong stackoverflow.com/a/23013574/1709587 , nhưng nếu vậy, chúng không được giải thích ở đây.
Đánh dấu

Đã được một lúc tôi đăng câu trả lời này. Tôi không thể nhớ nếu có bất kỳ lý do nào đằng sau những dòng mã không cần thiết đó.
Abk

3

Để cải thiện câu trả lời của Imagine Breaker, điều này được hỗ trợ trên 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);
}

Nói cách khác, chỉ cần sử dụng một dispatchEventchức năng thay vì click();


Làm thế nào đây là một cải tiến? Nó dường như chỉ là một cách phức tạp hơn để làm điều tương tự.
Đánh dấu

3

Có thể chỉ cần javascript của bạn mở một trang vừa tải xuống một tệp, như khi bạn kéo liên kết tải xuống sang một tab mới:

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

Với cửa sổ mở, mở một trang tải xuống tự động đóng lại.


1
Điều này tạo ra một cửa sổ bật lên, mà hầu hết các trình duyệt chặn
Ashton Wiersdorf 26/12/18

3

Mã hoàn chỉnh và hoạt động (đã được kiểm tra) nhất để tải xuống dữ liệu cho FireFox, mã Chrome và IE được tuân theo. Giả sử rằng Dữ liệu nằm trong trường texarea , có id = 'textarea_area'tên tệp là tên của tệp nơi dữ liệu sẽ được tải xuống.

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

}

và sau đó chỉ cần gọi

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

Để bắt đầu tải về.

Mảng để cài đặt loại MIME chính xác cho hộp thoại tải xuống CÓ THỂ sau:

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

- Tôi đã thử điều này với các tập tin pdf. Tập tin đang được tải xuống nhưng nó luôn bị hỏng. Bất kỳ đề xuất? Cảm ơn bạn
Shrivaths Kulkarni

2

Đối với tôi điều này đang hoạt động ok được thử nghiệm trong 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')

Đây chỉ là cách tiếp cận tương tự như trong câu trả lời của Imagine Breaker năm trước, nhưng với nhược điểm bổ sung là yêu cầu jQuery.
Mark Amery

1

Tôi đã có kết quả tốt khi sử dụng thẻ FORM vì nó hoạt động ở mọi nơi và bạn không phải tạo các tệp tạm thời trên máy chủ. Phương pháp hoạt động như thế này.

Về phía khách hàng (trang HTML), bạn tạo một biểu mẫu vô hình như thế này

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

Sau đó, bạn thêm mã Javascript này vào nút của mình:

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

Về phía máy chủ, bạn có mã PHP sau 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();

Bạn thậm chí có thể tạo các tệp zip của dữ liệu của mình như thế này:

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

Phần tốt nhất là nó không để lại bất kỳ tệp còn lại nào trên máy chủ của bạn vì mọi thứ được tạo và hủy ngay lập tức!


0

Câu trả lời được gửi bởi hitesh vào ngày 30 tháng 12 năm 13 thực tế hoạt động. Nó chỉ cần một chút điều chỉnh:

Các tập tin PHP có thể gọi chính nó. Nói cách khác, chỉ cần tạo một tệp có tên saveAs.php và đặt mã này vào đó ...

        <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

Các hàm này được sử dụng trong 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 '';
}

Điều này ... dường như chỉ dành cho XHR, không phải tải tệp? Tôi không thấy sự liên quan ở đây.
Đánh dấu

0

Tôi đề nghị bạn sử dụng sự kiện mousedown, được gọi là TRƯỚC sự kiện nhấp chuột. Bằng cách đó, trình duyệt xử lý sự kiện nhấp chuột một cách tự nhiên, giúp tránh mọi sự kỳ lạ về mã:

(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

Giải pháp Excelent từ Corbacho, tôi chỉ thích nghi để thoát khỏi var

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

0

Đã thử nghiệm Firefox và 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);

Đây thực sự là giải pháp "chrome" cho firefox (Tôi chưa thử nghiệm nó trên các trình duyệt khác, vì vậy vui lòng để lại nhận xét về khả năng biên dịch)


0

Có rất nhiều điều nhỏ có thể xảy ra khi cố gắng tải xuống một tập tin. Sự không nhất quán giữa các trình duyệt một mình là một cơn ác mộng. Tôi đã kết thúc việc sử dụng thư viện nhỏ tuyệt vời này. https://github.com/rndme/d Download

Điều tuyệt vời ở đây là nó linh hoạt không chỉ cho các url mà còn cho dữ liệu phía máy khách mà bạn muốn tải xuống.

  1. chuỗi văn bản
  2. dữ liệu văn bảnURL
  3. văn bản blob
  4. mảng văn bản
  5. chuỗi html
  6. blob html
  7. gọi lại ajax
  8. tập tin nhị phân

-1

Sử dụng thẻ neo và PHP có thể được thực hiện, Kiểm tra câu trả lời này

Cuộc gọi Ajax của JQuery để tải xuống tệp 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;
}
?>

Tôi đang kiểm tra kích thước tệp vì nếu bạn tải pdf từ CDN trên nền tảng đám mây, bạn sẽ không nhận được kích thước của tài liệu buộc tài liệu phải tải xuống trong 0kb, Để tránh điều này tôi đang kiểm tra với điều kiện này

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

-1

Tôi biết tôi đến dự tiệc muộn, nhưng tôi muốn chia sẻ giải pháp của mình, đó là biến thể của giải pháp Imagine Breaker ở trên. Tôi đã cố gắng sử dụng giải pháp của anh ấy, bởi vì giải pháp của anh ấy có vẻ đơn giản và dễ dàng nhất đối với tôi. Nhưng như những người khác đã nói, nó không hoạt động đối với một số trình duyệt, vì vậy tôi đã đặt một số biến thể cho nó bằng cách sử dụng jquery.

Hy vọng điều này có thể giúp đỡ một ai đó ra khỏi đó.

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

Toàn bộ cơ thể chức năng này chỉ là một cách làm quá phức tạp window.location.href = url. Liên kết bạn tạo không được sử dụng cho bất cứ điều gì.
Đánh dấu Amery

-1

Lưu ý: Không được hỗ trợ trong tất cả các trình duyệt.

Tôi đã tìm cách tải xuống một tệp bằng jquery mà không phải đặt url tệp trong thuộc tính href ngay từ đầu.

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

Tôi sử dụng giải pháp của @ rakaloof mà không có JQuery (vì bạn không cần nó ở đây ). Cảm ơn bạn cho ý tưởng! Đây là một giải pháp dựa trên hình thức 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);

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.