ลิงค์ดาวน์โหลดภาพ 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
ven

คำตอบ:


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แต่คุณสามารถใช้กับ modernizr https://modernizr.com/download/?adownload-setclasses ( ภายใต้การตรวจจับที่ไม่ใช่คอร์ ) เพื่อตรวจสอบการสนับสนุนของ เบราว์เซอร์


2
ขอบคุณสำหรับความคิดเห็นของคุณมันเป็นเรื่องดีที่จะรู้ แม้ว่าคุณจะต้องการ modernizr แต่ตอนนี้ฉันใช้มันในทุกโปรเจคของฉันดังนั้น ... ฉันจะยอมรับคำตอบของคุณในฐานะคำตอบใหม่
Pierre

1
ฉันคิดว่าคุณอาจเข้าใจผิดถึงบทบาทของ Modernizr ที่นี่ ในระยะสั้นจะไม่เพิ่มฟังก์ชันการทำงานที่ขาดหายไป ... ดูคำตอบนี้: stackoverflow.com/questions/18681644/…
bravokiloecho

@GauravManral สิ่งที่จะเป็นปัญหาหรือไม่
Francisco Costa

1
@GauravManral: IE ไม่รองรับดังที่กล่าวไว้ในคำตอบ ดูลิงก์ caniuse ที่ให้ไว้
peirix

8
สำคัญ : downloadแอตทริบิวต์ attributete ใช้งานได้กับ URL ต้นทางเดิมเท่านั้น เอกสาร MDN
cespon

59

วิธีที่ง่ายที่สุดในการสร้างลิงค์ดาวน์โหลดสำหรับรูปภาพหรือ html คือการตั้งค่าคุณสมบัติการดาวน์โหลดแต่โซลูชันนี้ใช้ได้กับเบราว์เซอร์รุ่นใหม่เท่านั้น

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

"myimage" เป็นชื่อไฟล์ที่จะดาวน์โหลด ส่วนขยายจะถูกเพิ่มโดยอัตโนมัติ ตัวอย่างที่นี่


จะใช้งานได้กับกล่องข้อความ Windows หรือไม่ ฉันพยายามดูเหมือนว่าจะไม่ทำงาน แต่บางทีฉันอาจทำอะไรผิดไป!
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: แล้ววิธีที่ปลอดภัยที่สุดคืออะไร ... ยกเว้นคำตอบที่ถูก ticked ??
HIRA THAKUR

3
เพื่อหลีกเลี่ยงปัญหาด้านความปลอดภัยอย่าใช้ข้อมูลพา ธ สัมบูรณ์หรือสัมพัทธ์จากคำขอ รับชื่อไฟล์เท่านั้น ตัดเส้นพา ธ เช่นใช้ $ file = pathInfo ($ _ GET ['file'] จากนั้นรวบรวมพา ธ โดยต่อท้ายพา ธ ที่รู้จักด้วย $ file ['basename'] หากคุณต้องการให้ไฟล์จากโฟลเดอร์ต่าง ๆ ให้ใช้โทเค็นพา ธ ในคำขอของคุณซึ่งคุณแมปไปยังเส้นทางที่แท้จริงในฟังก์ชั่นดาวน์โหลดของคุณ
Alexander233

1
หรือสร้างตารางที่มีรหัส, โทเค็น, ความสัมพันธ์พา ธ , รับโทเค็นจาก URL, ตรวจสอบเส้นทางในฐานข้อมูลและส่งคืนไฟล์นั้น นั่นจะปลอดภัยกว่า แต่เห็นได้ชัดว่าซับซ้อนมากขึ้น
Felype

10

ไม่มันไม่ใช่ คุณจะต้องมีบางอย่างบนเซิร์ฟเวอร์เพื่อส่งส่วนหัวของเนื้อหาการจัดการเพื่อตั้งไฟล์เป็นสิ่งที่แนบมาแทนที่จะเป็นแบบอินไลน์ คุณสามารถทำได้ด้วยการกำหนดค่า Apache ธรรมดา

ฉันพบตัวอย่างของการทำโดยใช้ mod_rewriteแม้ว่าฉันจะรู้ว่ามีวิธีที่ง่ายกว่า


6
เฮ้คุณพูดว่า: "แม้ว่าฉันจะรู้ว่ามีวิธีที่ง่ายกว่า" ... อันไหน? ^ _ ^
Pierre

หากฉันสามารถหารายละเอียดได้ฉันจะโพสต์ไว้ ฉันหามันไม่พบในตอนนี้และไม่มีเวลาที่จะอุทิศเพื่อการค้นหาที่ครอบคลุม
Quentin

1
ขอบคุณสำหรับความช่วยเหลือของคุณ ฉันเพิ่งสร้างหน้า PHP ที่สร้างดาวน์โหลด ...
ปิแอร์



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 ล่าสุด
Pierre

สวัสดี Pierre ลองใช้ <a href=" w3schools.com/images/myw3schoolsimage.jpg "ดาวน์โหลด>ดาวน์โหลดรูปภาพ >> </a> ขอบคุณ
Rizo

4

คุณไม่สามารถทำได้ด้วย html / javascript แท้ๆ นี่เป็นเพราะคุณมีการเชื่อมต่อแยกต่างหากกับเว็บเซิร์ฟเวอร์เพื่อดึงไฟล์แยกต่างหาก (รูปภาพ) และเว็บเซิร์ฟเวอร์ปกติจะให้บริการไฟล์ที่มีส่วนหัวของเนื้อหาที่กำหนดเพื่อให้เบราว์เซอร์ที่อ่านประเภทเนื้อหาจะตัดสินใจว่าสามารถจัดการประเภทภายในได้

วิธีบังคับเบราว์เซอร์ไม่ให้จัดการไฟล์ภายในคือการเปลี่ยนส่วนหัว (การจัดการเนื้อหาก่อนหรือประเภทเนื้อหา) ดังนั้นเบราว์เซอร์จะไม่พยายามจัดการไฟล์ภายใน คุณสามารถทำได้โดยการเขียนสคริปต์บนเว็บเซิร์ฟเวอร์ที่ตั้งค่าส่วนหัวแบบไดนามิก (เช่น download.php) หรือโดยการกำหนดค่าเว็บเซิร์ฟเวอร์เพื่อส่งกลับส่วนหัวที่แตกต่างกันสำหรับไฟล์ที่คุณต้องการดาวน์โหลด คุณสามารถทำได้แบบต่อไดเรกทอรีบนเว็บเซิร์ฟเวอร์ซึ่งจะช่วยให้คุณไม่ต้องเขียน php หรือ javascript เพียงแค่มีรูปภาพดาวน์โหลดทั้งหมดของคุณในที่เดียว


1
ไม่การโกหกเกี่ยวกับประเภทเนื้อหาไม่ใช่วิธีเดียวที่จะทำให้บรรลุผล ดูที่ส่วนหัวการตอบสนอง HTTP ของเนื้อหาการจัดการ
Quentin

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>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.