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


113

Làm cách nào để nhắc tải xuống cho người dùng khi họ nhấp vào liên kết.

Ví dụ, thay vì:

<a href="uploads/file.doc">Download Here</a>

Tôi có thể sử dụng:

<a href="#">Download Here</a>

 $('a').click... //Some jquery to download the file

Bằng cách này, Google không lập chỉ mục các tệp riêng tư và HREF của tôi.

Điều này có thể được thực hiện với jQuery, nếu vậy, làm thế nào? Hay điều này nên được thực hiện với PHP hoặc một cái gì đó thay thế?


Có thể có bản sao của Tải xuống Tệp bằng Javascript / jQuery
Liam

Câu trả lời:


165

Tôi có thể đề xuất điều này, như một giải pháp làm giảm hiệu quả hơn, bằng cách sử dụng preventDefault:

$('a').click(function(e) {
    e.preventDefault();  //stop the browser from following
    window.location.href = 'uploads/file.doc';
});

<a href="no-script.html">Download now!</a>

Ngay cả khi không có Javascript, ít nhất bằng cách này, người dùng sẽ nhận được một số phản hồi.


20
jQuery là những câu trả lời.
Esteban Küber

Cảm ơn, đây là những gì tôi đang tìm kiếm. Tôi thường sử dụng "PreventDefault", chỉ bỏ nó ở trên vì tôi lười biếng. ;-)
Dodinas

2
Hoạt động tốt nhưng gặp một số lỗi loại MIME. Tò mò nếu có bất kỳ cách nào để vượt qua chúng?
Nathan Hangen,

2
Bạn đã giải quyết được cảnh báo kiểu MIME chưa? Tôi nhận được "Tài nguyên được hiểu là Tài liệu nhưng được chuyển với kiểu MIME ..." Rất cảm ơn.
user1824269

22

Nếu bạn không muốn công cụ tìm kiếm lập chỉ mục các tệp nhất định, bạn có thể sử dụng robots.txt để thông báo cho trình thu thập dữ liệu web không truy cập vào một số phần nhất định của trang web của bạn.

Nếu bạn chỉ dựa vào javascript, thì một số người dùng duyệt mà không có nó sẽ không thể nhấp vào liên kết của bạn.


1
Bạn nên biết về 'robots.txt'. Cảm ơn bạn.
Dodinas

@Rob, Nếu bạn cần URL ở chế độ "riêng tư", robots.txtsẽ không hữu ích vì nó sẽ vẫn được lưu trữ trong lịch sử trình duyệt và máy chủ trung gian.
Pacerier

3
6 năm sau: duyệt web mà không cần javascript? - tốt, bạn cũng có thể đi dạo thay thế.
low_rents

gần 10 năm sau: cũng vậy! hoặc là ?
toing_toing

18

Đây là một bài viết hay chỉ ra nhiều cách ẩn tệp khỏi công cụ tìm kiếm:

http://antezeta.com/news/avoid-search-engine-indexing

JavaScript không phải là một cách tốt để không lập chỉ mục một trang; nó sẽ không ngăn người dùng liên kết trực tiếp đến tệp của bạn (và do đó tiết lộ nó cho trình thu thập thông tin) và như Rob đã đề cập, sẽ không hoạt động với tất cả người dùng.
Một cách khắc phục dễ dàng là thêm rel="nofollow"thuộc tính, tuy nhiên, một lần nữa, thuộc tính này không hoàn chỉnh nếu không có tệp robots.txt.

<a href="uploads/file.doc" rel="nofollow">Download Here</a>


12

Có, bạn sẽ phải thay đổi window.location.href thành url của tệp bạn muốn tải xuống.

window.location.href = 'http://www.com/path/to/file';

điều gì sẽ xảy ra nếu phần mở rộng của tệp là .html, thay vì tải xuống, nó sẽ chuyển hướng đến tệp html đó
Kaleem Nalband

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

không có lỗi, chỉ tải xuống không bắt đầu. tôi nghĩ rằng có thể có một số điểm tôi bị thiếu trong khi tạo phần tử.
shyammakwana.me

xác minh trong html của bạn xem có phần tử <a> được tạo hay không và xác minh liên kết tệp của bạn.
EL missaoui habib

một thẻ đã ở đó, trong cơ thể. và bằng cách nhấp thủ công, nó sẽ tải xuống hình ảnh. tuy nhiên nó không cần thiết bây giờ, tôi đã sử dụng giải pháp vaniJS này.
shyammakwana.me

không có lý do cho việc không hoạt động là liên kết chính xác. kiểm tra các liên kết trực tiếp trong trình duyệt
EL missaoui Habib

$('blah').each(function(){ $('body').append('<a href="'+xxx+'" download="'+dynamicname+'" />'); }) $('a').trigger('click');tôi đã sử dụng nó.
shyammakwana.me

7
  • Sử dụng hàm jQuery

        var valFileDownloadPath = 'http//:'+'your url';
    
       window.open(valFileDownloadPath , '_blank');

6

Bằng cách nêu rõ window.location.href = 'uploads/file.doc';bạn hiển thị nơi bạn lưu trữ các tệp của mình. Tất nhiên, bạn có thể sử dụng .htacess để buộc hành vi cần thiết cho các tệp được lưu trữ, nhưng điều này có thể không phải lúc nào cũng hữu ích ....

Tốt hơn là tạo một tệp php phía máy chủ và đặt nội dung này vào đó:

header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.$_REQUEST['f']);
readfile('../some_folder/some_subfolder/'.$_REQUEST['f']); 
exit;

Mã này sẽ trả về BẤT KỲ tệp nào dưới dạng tải xuống mà không hiển thị nơi bạn thực sự lưu trữ tệp đó.

Bạn mở tệp php này qua window.location.href = 'scripts/this_php_file.php?f=downloaded_file';


Giải pháp này đã giúp tôi khắc phục sự cố tải xuống trên trang web của mình, cảm ơn!
Denniz

3

Iframe ẩn có thể giúp


var redFrame = document.createElement ("iframe"); var src = "doDownload.php"; redFrame.setAttribute ("src", src); redFrame.setAttribute ("style", "display: none"); document.body.appendChild (RedFrame);
DarthRez

3

Tôi khuyên bạn nê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, tránh bất kỳ sự kỳ lạ nào của 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").on('mousedown', function () {
            $(this).attr("href", url);
        });

    });
})(jQuery);

0

Xem bài đăng tương tự về cách sử dụng jQuery để xóa biểu mẫu tại đây: Đặt lại biểu mẫu nhiều giai đoạn với jQuery

Bạn cũng có thể gặp phải sự cố trong đó các giá trị đang được lập lại bởi ngăn xếp giá trị thanh chống. Nói cách khác, bạn gửi biểu mẫu của mình, thực hiện bất kỳ điều gì trong lớp hành động, nhưng không xóa các giá trị trường liên quan trong lớp hành động. Trong trường hợp này, biểu mẫu sẽ xuất hiện để duy trì các giá trị bạn đã gửi trước đó. Nếu bạn đang kiên trì những điều này theo một cách nào đó, chỉ cần bỏ trống mỗi giá trị trường trong lớp hành động của bạn sau khi kiên trì và trước khi trả về SUCCESS.

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.