点击下载href图片链接


184

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

Answers:


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

尚不完全支持caniuse,但是您可以将其与modernizr结合使用(在Non- coredetects)以检查浏览器的支持。


2
感谢您的评论,这是一件好事。尽管您需要modernizr,但是我现在在我的所有项目中都使用它,因此...我将接受您的答案作为新答案
Pierre

1
我认为您可能在这里误解了Modernizr的角色。总之,它不会添加缺少的功能......看到这样的回答:stackoverflow.com/questions/18681644/...
bravokiloecho

@GauravManral是什么接缝问题?
Francisco Costa

1
@GauravManral:如答案中所述,IE不支持它。查看提供的caniuse链接。
peirix

11
重要提示download属性属性仅适用于同源URLMDN Docs
cespon

60

为图像或html创建下载链接的最简单方法是设置download属性,但是此解决方案仅在现代浏览器中有效。

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

“ myimage”是要下载的文件的名称。扩展将自动添加 此例


这对Windows Message Box有用吗?我尝试过,似乎没有用,但是也许我做错了?!
Z77 2014年

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
存在安全问题,应关闭“应用程序/强制下载”内容类型!可以下载任何内容,包括服务器PHP源代码!
CharlesB 2012年

3
@CharlesB是正确的,例如,这将允许您使用目录遍历从服务器下载任何内容<a href="download.php?file=../dbparams.inc>">Download</a>。此处的更多信息:en.wikipedia.org/wiki/Directory_traversal_attack
OrganicPanda 2012年

@CharlesB:那么最安全的方法是什么...除了打勾的答案?
希拉·塔库尔

3
要解决安全问题,请不要从请求中获取绝对或相对路径信息;仅获取文件名。剥离路径,例如使用$ file = pathInfo($ _ GET ['file'],然后通过在$ file ['basename']后面附加一些已知的路径来组装路径。如果需要提供来自各个文件夹的文件,请使用路径标记在您的请求中,然后您将其映射到下载功能中的实际路径
Alexander233

1
或创建具有Id,Token,Path关系的表,从URL获取令牌,检查数据库中的Path并返回该文件。这样会更安全。但是显然更加复杂。
Felype

10

不,不是。您将需要服务器上的某些东西来发送Content-Disposition标头,以将文件设置为附件,而不是内联。您可以使用简单的Apache配置来执行此操作。

我已经找到了使用mod_rewrite进行操作的示例,尽管我知道有一种更简单的方法。


6
嘿,您说:“尽管我知道有一种更简单的方法”……哪一个?^ _ ^
Pierre

如果我可以找到详细信息,则将其发布。我现在找不到它们,也没有时间专门进行广泛的搜索。
昆汀2010年

1
很好,谢谢您的帮助。我刚刚创建了一个生成下载的php页面...
Pierre


8

试试这个...

<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“下载>下载图像>> </a>谢谢
Rizo

4

您无法使用纯html / javascript做到这一点。这是因为您具有与Web服务器的单独连接以检索单独的文件(图像),并且普通的Web服务器将为设置了内容标头的文件提供文件,以便浏览器读取内容类型将决定可以在内部处理该类型。

强制浏览器不在内部处理文件的方法是更改​​标头(最好是内容放置或内容类型),以便浏览器不会尝试在内部处理文件。您可以通过在网络服务器上编写一个脚本来动态设置标头(例如,download.php)来完成此操作,也可以通过配置网络服务器为要下载的文件返回不同的标头来做到这一点。您可以在网络服务器上的每个目录上执行此操作,这将使您无需编写任何php或javascript即可摆脱困境-只需将所有下载图像放在该位置即可。


1
不。说谎的内容类型不是实现此目的的唯一方法。请参阅内容处置HTTP响应标头。
昆汀2010年

3

使用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>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.