【问题标题】:href image link download on clickhref图片链接点击下载
【发布时间】:2011-01-25 08:59:12
【问题描述】:

我在网络应用程序中生成普通链接,例如:<a href="/path/to/image"><img src="/path/to/image" /></a>。

当我点击链接时,它会在新页面中显示图片。如果要保存图片,则需要右键单击并选择“另存为”

我不希望这种行为,我希望在单击链接时弹出一个下载框,仅使用 html 或 javascript 可能吗?怎么样?

如果不是,我想我将不得不编写一个 download.php 脚本并将其以文件名作为参数调用到 href...?

【问题讨论】:

标签: html image download href


【解决方案1】:

不,不是。您将需要服务器上的某些内容来发送 Content-Disposition 标头以将文件设置为附件而不是内联。不过,您可以使用简单的 Apache 配置来做到这一点。

我找到了an example of doing it using mod_rewrite,虽然我知道有更简单的方法。

【讨论】:

  • 嘿,你说:“虽然我知道有一个更简单的方法”......哪一个? ^_^
  • 如果我能找到详细信息,我会发布它们。我现在找不到它们,也没有时间进行广泛的搜索。
  • 很好,感谢您的帮助。我刚刚创建了一个生成下载的 php 页面...
【解决方案2】:

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

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

【讨论】:

  • 没有。对内容类型撒谎并不是实现这一目标的唯一方法。请参阅 content-disposition HTTP 响应标头。
【解决方案3】:
<a href="download.php?file=path/<?=$row['file_name']?>">Download</a>

下载.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');

}
?>

【讨论】:

  • 存在安全问题,应关闭“application/force-download”Content-Type!它可以下载任何东西,包括服务器 PHP 源代码!
  • @CharlesB 是对的,这将允许您使用目录遍历从服务器下载任何内容:例如&lt;a href="download.php?file=../dbparams.inc&gt;"&gt;Download&lt;/a&gt;。更多信息:en.wikipedia.org/wiki/Directory_traversal_attack
  • @CharlesB:那么最安全的方法是什么...除了勾选的答案??
  • 为了绕过安全问题,不要从请求中获取绝对或相对路径信息;只获取文件名。剥离路径,例如使用 $file = pathInfo($_GET['file'] 然后通过在 $file['basename'] 后面附加一些已知路径来组装路径。如果您需要提供来自不同文件夹的文件,请使用路径标记在您的请求中,然后您将其映射到下载函数中的实际路径。
  • 或者创建一个具有Id、Token、Path关系的表,从URL获取token,检查数据库中的Path并返回该文件。那会更安全。但显然更复杂。
【解决方案4】:

为图像或 html 创建下载链接的最简单方法是设置 download attribute,但此解决方案仅适用于现代浏览器。

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

“myimage”是要下载的文件名。扩展将自动添加 Example here

【讨论】:

  • 这适用于 Windows 消息框吗?我试过了,好像不行,可能是我做错了什么?!
【解决方案5】:
<a download="custom-filename.jpg" href="/path/to/image" title="ImageName">
    <img alt="ImageName" src="/path/to/image">
</a>

还没有完全支持caniuse,但你可以使用modernizr(在非核心检测下)来检查浏览器的支持。

【讨论】:

  • 感谢您的评论,这是件好事。虽然你需要modernizr,但我现在在我所有的项目中都使用它,所以......我会接受你的答案作为新答案
  • 我想你可能误解了 Modernizr 在这里的作用。简而言之,它不会添加缺少的功能...请参阅此答案:stackoverflow.com/questions/18681644/…
  • @GauravManral 接缝是什么问题?
  • @GauravManral:IE 不支持它,如答案中所述。查看提供的 caniuse 链接。
  • 重要提示:download 属性属性仅适用于同源 URL。 MDN Docs
【解决方案6】:

试试这个...

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

【讨论】:

    【解决方案7】:

    如果您使用的是 HTML5,则可以将“下载”属性添加到您的链接中。

    <a href="/test.pdf" download>
    

    http://www.w3schools.com/tags/att_a_download.asp

    【讨论】:

      【解决方案8】:

      使用图片点击下载图片!

      我做了这个简单的代码!:)

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

      【讨论】:

        【解决方案9】:

        使用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>
        

        【讨论】:

          【解决方案10】:

          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>
          

          输出:

          Download Image >>

          Html5下载或chrome

          Download Image >>

          【讨论】:

          • 您好,谢谢您的回答。有些人已经提出了这个,但我认为它仍然没有得到完全的支持。另一方面,您的下载链接在 Chrome 最新版上不适合我
          • 嘿皮埃尔,试试这个w3schools.com/images/myw3schoolsimage.jpg"下载>下载图片>>谢谢
          • 我试过你的评论,但它不起作用
          猜你喜欢
          • 2013-08-26
          • 2013-10-12
          • 1970-01-01
          • 1970-01-01
          • 2017-08-19
          • 2014-01-22
          • 2021-06-20
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多