href зображення посилання скачати на клацання


180

Я генерую звичайні посилання типу: <a href="https://stackoverflow.com/path/to/image"><img src="/path/to/image" /></a>у веб-програмі.

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

Я не бажаю такої поведінки, я хотів би, щоб при натисканні на посилання з’явилося вікно завантаження, чи можливо це лише за допомогою HTML або javascript? Як?

Якщо ні, я думаю, мені доведеться написати скрипт download.php і викликати його в href з назвою файла як параметр ...?


Ось простий спосіб зробити це з допомогою PHP клас: tutorialchip.com/php-download-file-script
аже

Відповіді:


239
<a download="custom-filename.jpg" href="/path/to/image" title="ImageName">
    <img alt="ImageName" src="/path/to/image">
</a>

Це ще не повністю підтримується http://caniuse.com/#feat=download , але ви можете використовувати за допомогою модернізації https://modernizr.com/download/?adownload-setclassesрозділі Непрофільні виявлення ), щоб перевірити підтримку браузер.


2
Дякуємо за ваш коментар, це добре знати. Хоча вам потрібен модернізатор, я зараз використовую його у всіх своїх проектах, тому я прийму вашу відповідь як нову відповідь
П'єр

1
Я думаю, ви могли б неправильно зрозуміти роль Модернізра тут. Коротше кажучи, це не додає функціональності, відсутній ... побачити цю відповідь: stackoverflow.com/questions/18681644 / ...
bravokiloecho

@GauravManral які шви будуть проблемою?
Франциско Коста-

1
@GauravManral: IE не підтримує це, як згадується у відповіді. Подивіться надане посилання на канюзу.
peirix

8
ВАЖЛИВО : downloadатрибут attributte працює лише для URL-адрес з однаковим походженням . Документи MDN
cespon

59

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

<a href="/path/to/image" download="myimage"><img src="/path/to/image" /></a>

"myimage" - це ім'я файлу для завантаження. Розширення буде додано автоматично Приклад тут


Чи буде це працювати для Windows Message Box? Я спробував, здається, не працює, але, можливо, я зробив щось не так ?!
Z77

48
<a href="download.php?file=path/<?=$row['file_name']?>">Download</a>

download.php:

<?php

$file = $_GET['file'];

download_file($file);

function download_file( $fullPath ){

  // Must be fresh start
  if( headers_sent() )
    die('Headers Sent');

  // Required for some browsers
  if(ini_get('zlib.output_compression'))
    ini_set('zlib.output_compression', 'Off');

  // File Exists?
  if( file_exists($fullPath) ){

    // Parse Info / Get Extension
    $fsize = filesize($fullPath);
    $path_parts = pathinfo($fullPath);
    $ext = strtolower($path_parts["extension"]);

    // Determine Content Type
    switch ($ext) {
      case "pdf": $ctype="application/pdf"; break;
      case "exe": $ctype="application/octet-stream"; break;
      case "zip": $ctype="application/zip"; break;
      case "doc": $ctype="application/msword"; break;
      case "xls": $ctype="application/vnd.ms-excel"; break;
      case "ppt": $ctype="application/vnd.ms-powerpoint"; break;
      case "gif": $ctype="image/gif"; break;
      case "png": $ctype="image/png"; break;
      case "jpeg":
      case "jpg": $ctype="image/jpg"; break;
      default: $ctype="application/force-download";
    }

    header("Pragma: public"); // required
    header("Expires: 0");
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    header("Cache-Control: private",false); // required for certain browsers
    header("Content-Type: $ctype");
    header("Content-Disposition: attachment; filename=\"".basename($fullPath)."\";" );
    header("Content-Transfer-Encoding: binary");
    header("Content-Length: ".$fsize);
    ob_clean();
    flush();
    readfile( $fullPath );

  } else
    die('File Not Found');

}
?>

17
Виникає проблема безпеки, якщо закрити "application / force-download" Content-Type! який може завантажити будь-що, включаючи джерело PHP сервера!
CharlesB

3
@CharlesB має рацію, це дозволить вам завантажити що-небудь із сервера за допомогою обходу каталогів: <a href="download.php?file=../dbparams.inc>">Download</a>наприклад. Більше інформації тут: en.wikipedia.org/wiki/Directory_traversal_attack
OrganicPanda

@CharlesB: то який найбезпечніший спосіб ... крім відміченої відповіді ??
HIRA THAKUR

3
Щоб вирішити проблему безпеки, не приймайте абсолютну чи відносну інформацію про шлях від запиту; отримати лише ім'я файлу. Прокладіть шлях, наприклад, використовуючи $ file = pathInfo ($ _ GET ['файл'], а потім зібрати шлях, додавши якийсь відомий шлях із $ file ['basename']. Якщо вам потрібно надати файли з різних папок, використовуйте маркери шляху у вашому запиті, який ви подаєте на фактичний шлях у функції завантаження.
Alexander233,

1
Або створіть таблицю із співвідношеннями Id, Token, Path, отримайте маркер з URL-адреси, перевірте Шлях у базі даних та поверніть цей файл. Це було б безпечніше. Але явно складніше.
Феліпе

10

Ні, це не так. Вам буде потрібно щось на сервері, щоб надіслати заголовок Content-Disposition, щоб встановити файл як вкладення, а не вбудований. Ви можете зробити це за допомогою звичайної конфігурації Apache.

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


6
Гей, ти кажеш: "хоча я знаю, що існує простіший спосіб" ... який? ^ _ ^
П’єр

Якби я міг знайти деталі, я б розмістив їх. Зараз я не можу їх знайти і не маю часу присвятити широкому пошуку.
Квентін

1
Це добре дякую за вашу допомогу. Я щойно створив сторінку php, яка генерує завантаження ...
П'єр


7

Спробуйте це...

<a href="/path/to/image" download>
    <img src="/path/to/image" />
 </a>

5

Атрибут завантаження HTML, щоб вказати, що ціль буде завантажена, коли користувач натисне на гіперпосилання.

Цей атрибут використовується лише якщо встановлено атрибут href.

Значенням атрибута буде ім'я завантаженого файлу. Немає обмежень щодо дозволених значень, і браузер автоматично виявить правильне розширення файлу та додасть його до файлу (.img, .pdf, .txt, .html тощо).

Приклад коду:

<a href="https://www.w3schools.com/images/myw3schoolsimage.jpg"> Download Image >></a>

HTML5:

<a href="https://www.w3schools.com/images/myw3schoolsimage.jpg" download> Download Image >></a>

Вихід :

Завантажити зображення >>

Завантажити Html5 або chrome

Завантажити зображення >>


1
Гей, дякую за відповідь. Деякі люди вже пропонували це, але я думаю, це все ще не підтримується повністю. З іншого боку, ваше посилання для завантаження не працює для мене найновішою версією Chrome
П'єр,

Гей П'єр, спробуйте цю <a href=" w3schools.com/images/myw3schoolsimage.jpg "download> Завантажити зображення >> </a> спасибі
Ризо

4

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

Спосіб змусити браузер не обробляти файл внутрішньо - змінити заголовки (бажано розміщення вмісту або тип вмісту), щоб браузер не намагався обробляти файл внутрішньо. Ви можете це зробити, написавши на веб-сервері сценарій, який динамічно встановлює заголовки (тобто download.php), або налаштувавши веб-сервер для повернення різних заголовків для файлу, який ви хочете завантажити. Це можна зробити на веб-сервері за каталогами, що дозволить вам піти, не записуючи жодного php чи javascript - просто розмістіть усі завантажені зображення в одному місці.


1
Ні. Брехня про тип вмісту - не єдиний спосіб досягти цього. Дивіться заголовок відповіді HTTP-відповіді на вміст.
Квентін

4

Простий код для завантаження зображень із натисканням зображення за допомогою php

<html>
<head>
    <title> Download-Button </title>
</head>
<body>
    <p> Click the image ! You can download! </p>
    <?php
    $image =  basename("http://localhost/sc/img/logo.png"); // you can here put the image path dynamically 
    //echo $image;
    ?>
    <a download="<?php echo $image; ?>" href="http://localhost/sc/img/logo.png" title="Logo title">
        <img alt="logo" src="http://localhost/sc/img/logo.png">
    </a>
</body>

2

Завантажте зображення за допомогою клацання зображення!

Я зробив цей простий код! :)

<html>
<head>
<title> Download-Button </title>
</head>
<body>
<p> Click the image ! You can download! </p>
<a download="logo.png" href="http://localhost/folder/img/logo.png" title="Logo title">
<img alt="logo" src="http://localhost/folder/img/logo.png">
</a>
</body>
</html>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.