ดาวน์โหลดไฟล์โดยใช้ jQuery


113

ฉันจะแจ้งให้ผู้ใช้ดาวน์โหลดได้อย่างไรเมื่อพวกเขาคลิกลิงก์

ตัวอย่างเช่นแทนที่จะเป็น:

<a href="uploads/file.doc">Download Here</a>

ฉันสามารถใช้:

<a href="#">Download Here</a>

 $('a').click... //Some jquery to download the file

ด้วยวิธีนี้ Google จะไม่จัดทำดัชนีไฟล์ HREF และไฟล์ส่วนตัวของฉัน

สามารถทำได้ด้วย jQuery ถ้าเป็นเช่นนั้นได้อย่างไร หรือควรทำด้วย PHP หรืออะไรบางอย่างแทน?


คำตอบ:


165

ฉันอาจแนะนำสิ่งนี้เป็นวิธีแก้ปัญหาที่ลดระดับลงอย่างสง่างามโดยใช้preventDefault:

$('a').click(function(e) {
    e.preventDefault();  //stop the browser from following
    window.location.href = 'uploads/file.doc';
});

<a href="no-script.html">Download now!</a>

แม้ว่าจะไม่มี Javascript แต่อย่างน้อยวิธีนี้ผู้ใช้จะได้รับคำติชม


20
jQuery เป็นคำตอบ
Esteban Küber

ขอบคุณนี่คือสิ่งที่ฉันกำลังมองหา ฉันมักจะใช้ "PreventDefault" เพียงแค่ปล่อยไว้ข้างบนเพราะฉันขี้เกียจ ;-)
Dodinas

2
ใช้งานได้ดี แต่ได้รับข้อผิดพลาดประเภท MIME อยากรู้ไหมว่ามีวิธีใดบ้างที่จะผ่านมันไปได้?
Nathan Hangen

2
คุณแก้คำเตือนประเภท MIME หรือไม่ ฉันได้รับ "ทรัพยากรที่ตีความว่าเป็นเอกสาร แต่ถ่ายโอนด้วยประเภท MIME ... " ขอบคุณมาก
user1824269

22

หากคุณไม่ต้องการให้เครื่องมือค้นหาจัดทำดัชนีไฟล์บางไฟล์คุณสามารถใช้robots.txtเพื่อบอกให้เว็บสไปเดอร์ไม่เข้าถึงบางส่วนของเว็บไซต์ของคุณ

หากคุณใช้เฉพาะจาวาสคริปต์ผู้ใช้บางคนที่เรียกดูโดยไม่ใช้มันจะไม่สามารถคลิกลิงก์ของคุณได้


1
นานาน่ารู้เกี่ยวกับ "robots.txt" ขอบคุณ.
Dodinas

@Rob หากคุณต้องการให้ URL เป็น "ส่วนตัว" robots.txtจะช่วยไม่ได้เพราะURL จะยังคงถูกเก็บไว้ในประวัติเบราว์เซอร์และเซิร์ฟเวอร์ตัวกลาง
Pacerier

3
6 ปีต่อมา: ท่องเว็บโดยไม่ใช้จาวาสคริปต์? - คุณสามารถไปเดินเล่นแทนได้
low_rents

เกือบ 10 ปีต่อมาเหมือนเดิม! หรือ ?
toing_toing

18

นี่เป็นบทความดีๆที่แสดงให้เห็นหลายวิธีในการซ่อนไฟล์จากเครื่องมือค้นหา:

http://antezeta.com/news/avoid-search-engine-indexing

JavaScript ไม่ใช่วิธีที่ดีที่จะไม่จัดทำดัชนีหน้า จะไม่ป้องกันไม่ให้ผู้ใช้เชื่อมโยงโดยตรงกับไฟล์ของคุณ (และเปิดเผยให้โปรแกรมรวบรวมข้อมูล) และตามที่ Rob กล่าวถึงจะไม่สามารถใช้ได้กับผู้ใช้ทุกคน
วิธีแก้ไขง่ายๆคือการเพิ่มrel="nofollow"แอตทริบิวต์อีกครั้ง แต่ก็ไม่สมบูรณ์หากไม่มี robots.txt

<a href="uploads/file.doc" rel="nofollow">Download Here</a>

2
นี่คืออีกหนึ่งความช่วยเหลือของ Google สำหรับ Webmasersซึ่งช่วยให้ฉันเข้าใจ rel "nofollow" หรือ "me" ได้มาก
000

12

ใช่คุณจะต้องเปลี่ยน window.location.href เป็น url ของไฟล์ที่คุณต้องการดาวน์โหลด

window.location.href = 'http://www.com/path/to/file';

จะเกิดอะไรขึ้นถ้านามสกุลไฟล์เป็น. html แทนที่จะดาวน์โหลดจะเปลี่ยนเส้นทางไปยังไฟล์ html นั้น
Kaleem Nalband

9
 var link=document.createElement('a');
 document.body.appendChild(link);
 link.href=url;
 link.click();

ไม่มีข้อผิดพลาดเพียงแค่การดาวน์โหลดไม่เริ่มต้น ฉันคิดว่าอาจมีบางจุดที่ฉันขาดหายไปในขณะที่สร้างองค์ประกอบ
shyammakwana.me

ตรวจสอบใน html ของคุณว่าองค์ประกอบ <a> ถูกสร้างขึ้นหรือไม่และยืนยันลิงก์ไฟล์ของคุณ
EL missaoui habib

มีแท็กอยู่ในร่างกาย และคลิกด้วยตนเองมันเป็นการดาวน์โหลดภาพ แต่ตอนนี้ยังไม่จำเป็นฉันใช้โซลูชัน vanillaJS นี้
shyammakwana.me

ไม่มีเหตุผลที่ไม่ทำงานลิงค์ถูกต้อง ทดสอบลิงก์โดยตรงในการเรียกดู
EL missaoui habib

$('blah').each(function(){ $('body').append('<a href="'+xxx+'" download="'+dynamicname+'" />'); }) $('a').trigger('click');ฉันใช้มัน
shyammakwana.me


6

โดยระบุว่าwindow.location.href = 'uploads/file.doc';คุณแสดงที่เก็บไฟล์ของคุณ แน่นอนคุณอาจใช้. htacess เพื่อบังคับให้เกิดพฤติกรรมที่จำเป็นสำหรับไฟล์ที่จัดเก็บ แต่สิ่งนี้อาจไม่เพียงพอ ...

ควรสร้างไฟล์ php ฝั่งเซิร์ฟเวอร์และวางเนื้อหานี้ไว้ในนั้น:

header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.$_REQUEST['f']);
readfile('../some_folder/some_subfolder/'.$_REQUEST['f']); 
exit;

รหัสนี้จะส่งคืนไฟล์ใด ๆ เป็นการดาวน์โหลดโดยไม่แสดงว่าคุณเก็บไว้ที่ใด

คุณเปิดไฟล์ php นี้ผ่าน window.location.href = 'scripts/this_php_file.php?f=downloaded_file';


โซลูชันนี้ช่วยฉันแก้ไขปัญหาการดาวน์โหลดบนไซต์ของฉันขอบคุณ!
Denniz


3

ฉันขอแนะนำให้คุณใช้เหตุการณ์มูสดาวน์ซึ่งเรียกว่าก่อนเหตุการณ์คลิก ด้วยวิธีนี้เบราว์เซอร์จะจัดการเหตุการณ์การคลิกอย่างเป็นธรรมชาติซึ่งจะหลีกเลี่ยงความผิดปกติของโค้ด:

(function ($) {


    // with this solution, the browser handles the download link naturally (tested in chrome and firefox)
    $(document).ready(function () {

        var url = '/private/downloads/myfile123.pdf';
        $("a").on('mousedown', function () {
            $(this).attr("href", url);
        });

    });
})(jQuery);

0

ดูที่นี่สำหรับโพสต์ที่คล้ายกันเกี่ยวกับการใช้ jQuery เพื่อล้างฟอร์ม: การรีเซ็ตฟอร์มหลายขั้นตอนด้วย jQuery

นอกจากนี้คุณอาจพบปัญหาที่มีการเติมค่าใหม่โดยกองค่า struts กล่าวอีกนัยหนึ่งคือคุณส่งแบบฟอร์มของคุณทำอะไรก็ได้ในคลาสการดำเนินการ แต่อย่าล้างค่าฟิลด์ที่เกี่ยวข้องในคลาสการดำเนินการ ในสถานการณ์นี้แบบฟอร์มจะปรากฏขึ้นเพื่อรักษาค่าที่คุณส่งไปก่อนหน้านี้ หากคุณยังคงมีอยู่ไม่ทางใดก็ทางหนึ่งให้ลบค่าฟิลด์แต่ละฟิลด์ในคลาสการดำเนินการของคุณหลังจากที่ยังคงมีอยู่และก่อนที่จะส่งคืน SUCCESS

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