Як я можу створити посилання для завантаження в HTML?


224

У мене є основна ідея HTML. Я хочу створити посилання для завантаження на своєму зразковому веб-сайті, але я не маю уявлення про те, як його створити. Як зробити посилання, щоб завантажити файл, а не відвідувати його?


11
Мітку прийняття цього питання слід переключити.
Пекка

Відповіді:


163

Ця відповідь застаріла. Тепер у нас є downloadатрибут . (див. також це посилання на MDN )

Якщо під посиланням для завантаження ви маєте на увазі посилання на файл для завантаження, використовуйте

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

target=_blankзробить нове вікно браузера з'явиться до початку завантаження. Це вікно зазвичай буде закрито, коли браузер виявить, що ресурс - це завантаження файлу.

Зауважте, що типи файлів, відомі веб-переглядачу (наприклад, JPG або GIF-зображення), як правило, відкриються в браузері.

Ви можете спробувати надсилати потрібні заголовки, щоб змусити завантаження, як зазначено, наприклад, тут . (для цього потрібен сценарій на стороні сервера або доступ до налаштувань сервера.)


1
чому б не використати атрибут завантаження, якщо ви отримаєте файл на зразок jpg, він завантажиться, а не просто відкриється.
Бен

2
Будь ласка, опустіть "target = '_ blank" ", оскільки це не буде працювати в IE. Ви це навіть тестували?
Тара

4
@Dudeson, будь ласка, вкажіть, що "не працюватиме" та в якій версії IE ви говорите. (Тепер безпечно використовувати підхід, описаний набагато пізнішою відповіддю TIIUNDER нижче. Він повинен отримати позначку прийняття.)
Pekka

2
@Sergiu відповідь - сім років. Я не можу його видалити, і запитувач не відповів на мій запит про перехід позначки прийняття ... нічого не можемо зробити, хоча я додам посилання на більш актуальну відповідь
Pekka

1
@Dani див. Відповідь TIIUNDER нижче, яка є правильною зараз.
Pekka

455

У сучасних браузерах, які підтримують HTML5, можливе наступне:

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

Ви також можете скористатися цим:

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

Це дозволить вам змінити ім’я файла, який фактично завантажується.


Я використовував той самий код для завантаження файлу PFD, і я перевірений у всіх браузерах, всі вони підтримують, але в сафарі цей код не працює сафарі замість завантаження pdf-файлу відкрити в новій вкладці.
Реніш Кунт

6
caniuse.com/#search=download%20attribute Працює в Chrome, Edge, Firefox, Opera та новіших браузерах Android 4.4+, а не в Internet Explorer і Safari.
Барт Веркойєн

Як це зробити, якщо я створюю посилання динамічно при натисканні кнопки?
Nongthonbam Tonthoi

1
@NongthonbamTonthoi не можна використовувати javascript для динамічного призначення href тегу
akshay kishore

1
Це не обов'язково працює, оскільки воно обмежене URL-адресами з однаковим походженням.
Натан

22

На додаток (або в заміну) до <a downloadвже згаданого атрибута HTML5, поведінка завантаження
браузера на диск також може бути спровокована наступним заголовком відповіді http:

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

Це було зроблено до HTML5 (і досі працює з браузерами, що підтримують HTML5).


4
Але для цього потрібна реалізація на сервері, правильно?
Ломба

@Lombas так, лише сервер може встановити заголовки відповідей http.
Myobis

Це повна відповідь? Вам також потрібно надіслати заголовок типу вмісту та прочитати файл, щоб примусити його завантажити. Можливо, хочу, щоб і на вашу відповідь. Повна відповідь тут: stackoverflow.com/a/1465631/2757916 .
Говінд Рай

це ідеально підходить для реалізації на сервері, просто точно також тип вмісту. він добре підтримується порівняно з downloadатрибутом
william.eyidi

9

Посилання для завантаження - це посилання на ресурс, який ви хочете завантажити. Він побудований так, як будь-яке інше посилання:

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

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

8

Для посилання на файл зробіть те саме, що і будь-яке інше посилання на сторінку:

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

Щоб змусити завантажувати речі, навіть якщо у них є вбудований плагін (Windows + QuickTime = ugh), ви можете використовувати це у своєму htaccess / apache2.conf:

AddType application/octet-stream EXTENSION

Дякую! це набагато простіше і є серверним! : DI знайшов це посилання, яке деталізує трохи більше. Дякую. htaccess-guide.com/adding-mime-types
Joe DF

Це призведе до завантаження всіх файлів цього типу. Добре, якщо це те, що ви хочете, але це може призвести до пристосувань, якщо ви забудете і хочете, щоб інший файл такого типу відображався в браузері замість завантаження.
TecBrat

4

Ця нитка, мабуть, давньоруська, але це працює в html5 для мого локального файлу.

Для pdfs:

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

Це має відкрити pdf у новому вікні та дозволити завантажити його (принаймні у firefox). Для будь-якого іншого файлу просто введіть його ім'я файлу. Щодо зображень та музики, ви хочете зберігати їх у тому самому каталозі, що і ваш сайт. Отож, як би

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

2

Атрибут завантаження не працює в IE, він ігнорує "завантаження" повністю. Завантаження не працює на Firefox, якщо href вказує на віддалений сайт. Тож приклад Одіна не працює на Firefox 41.0.2.


1

Тут є ще одна тонкість, яка може допомогти.

Я хочу мати посилання, які дозволяють відтворювати та відображати в браузері, а також лише для чистого завантаження. Новий атрибут завантаження чудово, але не працює весь час, оскільки примус браузера відтворювати або відображати файл все ще дуже сильний.

АЛЕ ... це засновано на вивченні розширення на ім'я файлу URL-адреси! Ви не хочете поспілкуватися з картографічним розширенням сервера, оскільки ви хочете доставити один і той же файл двома різними способами. Отже, для завантаження ви можете його обдурити, попростуючи посилання файлу на ім’я, непрозоре для цього відображення розширення, вказуючи на нього, а потім скориставшись функцією перейменування для завантаження, щоб виправити ім'я.

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

Я сподівався, що просто викинути фіктивний запит в кінці або іншим чином заблукати розширення буде працювати, але, на жаль, це не так.


0

Атрибут завантаження є новим для <a>тегу в HTML5

<a href="http://www.odin.com/form.pdf" download>Download Form</a>
або
<a href="http://www.odin.com/form.pdf" download="Form">Download Form</a>

Я вважаю за краще перший, який є кращим стосовно будь-якого розширення.


0

Ви можете скачати різним способом, яким ви можете слідувати моїм шляхом. Хоча файли можуть не завантажуватися через дозвіл дозволу, не встановлено, але у вашому середовищі це буде чудово працювати

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

ще один цей, також не вдасться через 'X-Frame-Options' до '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

Подобається це

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

Так файл name.jpg на сайті example.com виглядатиме так

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

Проблема останнього полягає в тому, що він відкриється в браузері, не пропонується для завантаження та збереження.
Пекка

9
Не буде працювати; браузер розглядає його як відносне посилання на ./www.example.com/name.jpg- ви повинні використовувати http://для абсолютних посилань із вказаним доменом.
Делан Азабані

-7

Я знаю, що я спізнююсь, але це те, що я отримав після 1 години пошуку

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

    ?>

і для завантажуваного посилання я це зробив

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

6
Це жахливо. Коли я бачу таке посилання для завантаження, я маю протистояти бажанню спробувати index.php? File = index.php, який у процесі копіювання / вставки вашого коду в кінцевому підсумку дасть зловмисникові доступ до вашої бази даних і хто знає що.
М.Страмм

1
Погана ідея. По-перше, тому, що ви змушуєте ваш сервер працювати більше, ніж потрібно. По-друге, тому що користувачі можуть завантажувати будь-який файл: p
Жозе Нето
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.