Làm cách nào để tạo liên kết tải xuống trong HTML?


224

Tôi có một ý tưởng cơ bản về HTML. Tôi muốn tạo liên kết tải xuống trong trang web mẫu của mình, nhưng tôi không biết làm thế nào để tạo liên kết. Làm cách nào để tạo liên kết để tải xuống tệp chứ không phải truy cập vào tệp?


11
Dấu chấp nhận cho câu hỏi này nên được chuyển đổi.
Pekka

Câu trả lời:


163

Câu trả lời này đã lỗi thời. Bây giờ chúng ta có downloadthuộc tính . (xem thêm liên kết này đến MDN )

Nếu theo "liên kết tải xuống", bạn có nghĩa là một liên kết đến một tệp để tải xuống, hãy sử dụng

  <a href="http://example.com/files/myfile.pdf" target="_blank">Download</a>

những target=_blanksẽ làm cho một cửa sổ trình duyệt mới xuất hiện trước khi bắt đầu tải về. Cửa sổ đó thường sẽ bị đóng khi trình duyệt phát hiện ra rằng tài nguyên là tệp tải xuống.

Lưu ý rằng các loại tệp được trình duyệt biết đến (ví dụ hình ảnh JPG hoặc GIF) thường sẽ được mở trong trình duyệt.

Bạn có thể thử gửi các tiêu đề phù hợp để buộc tải xuống như được phác thảo, ví dụ ở đây . (kịch bản phía máy chủ hoặc truy cập vào cài đặt máy chủ là bắt buộc cho điều đó.)


1
tại sao không sử dụng thuộc tính tải xuống, nếu bạn nhận được một tệp như jpg, nó sẽ tải xuống, thay vì chỉ mở.
Ben

2
Vui lòng bỏ qua "target = '_ blank'", vì nó sẽ không hoạt động trong IE. Bạn thậm chí đã kiểm tra nó?
Tara

4
@Dudeson vui lòng chỉ định "sẽ không hoạt động" và phiên bản IE nào bạn đang nói đến. (Tuy nhiên, giờ đây an toàn khi sử dụng phương pháp mô tả câu trả lời gần đây hơn nhiều của TIIUNDER bên dưới. Nó sẽ nhận được dấu chấp nhận.)
Pekka

2
@Sergiu câu trả lời là bảy tuổi. Tôi không thể xóa nó và người hỏi đã không trả lời yêu cầu của tôi để chuyển dấu chấp nhận ... chúng tôi không thể làm gì, mặc dù tôi sẽ thêm một liên kết đến câu trả lời hiện tại hơn
Pekka

1
@Dani xem câu trả lời của TIIUNDER bên dưới, đây là câu trả lời đúng.
Pekka

455

Trong các trình duyệt hiện đại hỗ trợ HTML5, có thể có các cách sau:

<a href="link/to/your/download/file" download>Download link</a>

Bạn cũng có thể sử dụng điều này:

<a href="link/to/your/download/file" download="filename">Download link</a>

Điều này sẽ cho phép bạn thay đổi tên của tệp thực sự đang được tải xuống.


Tôi đã sử dụng cùng một mã để tải xuống tệp PFD và tôi đã thử nghiệm trong tất cả các trình duyệt đều hỗ trợ nhưng trong safari mã này không hoạt động safari thay vì tải xuống tệp pdf mở trong tab mới.
Đổi mới Khunt 23/2/2015

6
caniuse.com/#search=doad%20attribution Works trong Chrome, Edge, Firefox, Opera và các trình duyệt Android 4.4+ mới nhất và không có trong Internet Explorer và Safari.
Bart Verkoeijen

Làm thế nào để tôi làm điều này nếu tôi đang tạo liên kết động trên một nút bấm?
Nongthonbam Tonthoi

1
@NongthonbamTonthoi bạn không thể sử dụng javascript để tự động gán href cho thẻ
akshay kishore

1
Điều này không nhất thiết phải hoạt động, vì nó bị giới hạn ở các URL cùng nguồn gốc.
Nathan

22

Ngoài ra (hoặc thay thế) cho <a downloadthuộc tính của HTML5 đã được đề cập, hành vi tải xuống
trình duyệt đĩa của trình duyệt cũng có thể được kích hoạt bởi tiêu đề phản hồi http sau:

Content-Disposition: attachment; filename=ProposedFileName.txt;

Đây là cách làm trước HTML5 (và vẫn hoạt động với các trình duyệt hỗ trợ HTML5).


4
Nhưng điều đó đòi hỏi phải thực hiện phía máy chủ, đúng không?
Oliveras

@Lombas có, chỉ máy chủ mới có thể đặt tiêu đề phản hồi http.
Myobis

Đây có phải là câu trả lời đầy đủ? Bạn cũng cần gửi tiêu đề Kiểu nội dung và đọc tệp để buộc tải xuống. Có thể muốn và đó là câu trả lời của bạn. Câu trả lời đầy đủ ở đây: stackoverflow.com/a/1465631/2757916 .
Govind Rai

Điều này là hoàn hảo cho việc thực hiện phía máy chủ, cũng chính xác là loại nội dung. nó được hỗ trợ tốt so với downloadthuộc tính
william.eyidi

9

Liên kết tải xuống sẽ là liên kết đến tài nguyên bạn muốn tải xuống. Nó được xây dựng theo cách tương tự như bất kỳ liên kết nào khác:

<a href="path to resource.name of file">Link</a>

<a href="files/installer.exe">Link to installer</a>

8

Để liên kết đến tệp, làm tương tự như bất kỳ liên kết trang nào khác:

<a href="...">link text</a>

Để buộc mọi thứ phải tải xuống ngay cả khi chúng có plugin nhúng (Windows + QuickTime = ugh), bạn có thể sử dụng tiện ích này trong htaccess / apache2.conf:

AddType application/octet-stream EXTENSION

Cảm ơn! Điều này đơn giản hơn nhiều và trên toàn máy chủ! : DI tìm thấy liên kết này chi tiết hơn một chút. Cảm ơn bạn. htaccess-guide.com/adding-mime-types
Joe DF

Điều đó sẽ làm cho tất cả các tệp thuộc loại đó chỉ tải xuống. Tốt nếu đó là những gì bạn muốn, nhưng có thể gây ra sự phù hợp nếu bạn quên và muốn một tệp khác thuộc loại đó hiển thị trên trình duyệt thay vì tải xuống.
TecBrat

4

Chủ đề này có lẽ là cổ xưa, nhưng nó hoạt động trong html5 cho tệp cục bộ của tôi.

Đối với pdf:

<p><a href="file:///........example.pdf" download target="_blank">test pdf</a></p>

Điều này sẽ mở pdf trong một cửa sổ mới và cho phép bạn tải xuống (ít nhất là trong firefox). Đối với bất kỳ tệp nào khác, chỉ cần đặt tên tệp. Đối với hình ảnh và âm nhạc, bạn muốn lưu trữ chúng trong cùng thư mục với trang web của bạn. Vì vậy, nó sẽ giống như

<p><a href="images/logo2.png" download>test pdf</a></p>

2

Thuộc tính tải xuống không hoạt động trong IE, nó hoàn toàn bỏ qua "tải xuống". Tải xuống không hoạt động trên Firefox nếu href trỏ đến một trang web từ xa. Vì vậy, ví dụ của Odin không hoạt động trên Firefox 41.0.2.


1

Có thêm một sự tinh tế có thể giúp đỡ ở đây.

Tôi muốn có các liên kết cho phép cả trình duyệt và hiển thị trên trình duyệt cũng như một liên kết để tải xuống hoàn toàn. Thuộc tính tải xuống mới vẫn ổn, nhưng không hoạt động mọi lúc vì trình duyệt bắt buộc phải phát hoặc hiển thị tệp vẫn rất mạnh.

NHƯNG .. điều này dựa trên việc kiểm tra tiện ích mở rộng trên tên tệp của URL! Bạn không muốn sử dụng ánh xạ tiện ích mở rộng của máy chủ vì bạn muốn phân phối cùng một tệp theo hai cách khác nhau. Vì vậy, để tải xuống, bạn có thể đánh lừa nó bằng cách liên kết tệp mềm với một tên không rõ ràng với ánh xạ mở rộng này, chỉ vào nó, sau đó sử dụng tính năng đổi tên của tải xuống để sửa tên.

<a target="_blank" download="realname.mp3" href="realname.UNKNOWN">Download it</a>
<a target="_blank" href="realname.mp3">Play it</a>

Tôi đã hy vọng chỉ cần ném một truy vấn giả vào cuối hoặc bằng cách nào đó làm mờ phần mở rộng sẽ hoạt động, nhưng thật đáng buồn, nó không.


0

Thuộc tính tải xuống là mới cho <a>thẻ trong HTML5

<a href="http://www.odin.com/form.pdf" download>Download Form</a>
hoặc là
<a href="http://www.odin.com/form.pdf" download="Form">Download Form</a>

Tôi thích cái đầu tiên hơn là bất kỳ phần mở rộng nào.


0

Bạn có thể tải xuống theo nhiều cách khác nhau mà bạn có thể làm theo cách của tôi. Mặc dù các tệp có thể không tải xuống do không cho phép 'cho phép cửa sổ bật lên' nhưng trong môi trường của bạn, điều này sẽ hoạt động hoàn hảo

<div className="col-6">
                    <a  download href="https://www.w3schools.com/images/myw3schoolsimage.jpg" >Test Download </a>
                </div>

một cái khác cái này cũng sẽ thất bại do 'Tùy chọn khung X' thành 'sameorigin'.

<a href="https://www.w3schools.com/images/myw3schoolsimage.jpg" download>
  <img src="https://www.w3schools.com/images/myw3schoolsimage.jpg" alt="W3Schools" width="104" height="142">
</a>


-3

Như thế này

<a href="www.yoursite.com/theThingYouWantToDownload">Link name</a>

Vì vậy, một tập tin name.jpg trên một trang web example.com sẽ trông như thế này

<a href="www.example.com/name.jpg">Image</a>

Vấn đề với cái sau là nó sẽ mở trong trình duyệt, không được cung cấp để tải xuống và lưu.
Pekka

9
Không làm việc; trình duyệt sẽ coi nó như một liên kết tương đối ./www.example.com/name.jpg- bạn phải sử dụng http://cho các liên kết tuyệt đối với tên miền được chỉ định.
Delan Azabani

-7

tôi biết tôi đến muộn nhưng đây là những gì tôi nhận được sau 1 giờ tìm kiếm

 <?php 
      $file = 'file.pdf';

    if (! file) {
        die('file not found'); //Or do something 
    } else {
       if(isset($_GET['file'])){  
        // Set headers
        header("Cache-Control: public");
        header("Content-Description: File Transfer");
        header("Content-Disposition: attachment; filename=$file");
        header("Content-Type: application/zip");
        header("Content-Transfer-Encoding: binary");
        // Read the file from disk
        readfile($file); }
    }

    ?>

và để liên kết tải về, tôi đã làm điều này

<a href="index.php?file=file.pdf">Download PDF</a>

6
Điều này thật tồi tệ. Khi tôi thấy một liên kết tải xuống như vậy, tôi phải chống lại sự thôi thúc muốn thử index.php? File = index.php mà trong quá trình sao chép / dán mã của bạn cuối cùng sẽ cung cấp cho người độc hại quyền truy cập vào cơ sở dữ liệu của bạn và ai biết được điều gì.
M.Stramm

1
Ý kiến ​​tồi. Đầu tiên, bởi vì bạn đang làm cho máy chủ của bạn hoạt động nhiều hơn mức cần thiết. Thứ hai, bởi vì người dùng có thể tải xuống bất kỳ tệp nào: p
José Neto
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.