JQuery Kullanarak Dosyayı İndirin


113

Bir bağlantıyı tıkladığında kullanıcı için nasıl indirme isteyebilirim?

Örneğin, bunun yerine:

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

Kullanabilirim:

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

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

Bu şekilde Google, HREF'lerimi ve özel dosyalarımı dizine eklemez.

Bu jQuery ile yapılabilir mi, öyleyse nasıl? Yoksa bunun yerine PHP veya başka bir şey ile mi yapılmalı?


Yanıtlar:


165

Bunu daha incelikli bir şekilde aşağılayıcı bir çözüm olarak önerebilirim 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 olmasa bile, en azından bu şekilde kullanıcı bazı geri bildirimler alacak.


20
jQuery olan cevap.
Esteban Küber

Teşekkürler, aradığım şey buydu. Genelde "preventDefault" kullanıyorum, sadece tembel davrandığım için yukarıda bıraktım. ;-)
Dodinas

2
Harika çalışıyor, ancak bazı MIME türü hataları alın. Onları geçmenin herhangi bir yolu var mı merak ediyorsunuz?
Nathan Hangen

2
MIME türü uyarıyı çözdünüz mü? "Kaynak Belge olarak yorumlandı ancak MIME türüyle aktarıldı ..." Çok teşekkürler.
user1824269

22

Arama motorlarının belirli dosyaları dizine eklemesini istemiyorsanız, web örümceklerine web sitenizin belirli bölümlerine erişmemelerini söylemek için robots.txt dosyasını kullanabilirsiniz .

Yalnızca javascript'e güveniyorsanız, o zaman o olmadan göz atan bazı kullanıcılar bağlantılarınızı tıklayamayacaktır.


1
'Robots.txt' hakkında bilmek güzel. Teşekkür ederim.
Dodinas

@Rob, URL'lerin "özel" olmasına ihtiyacınız varsa, robots.txtyardımcı olmaz çünkü yine de tarayıcı geçmişinde ve aracı sunucularda saklanacaktır.
Pacerier

3
6 yıl sonra: JavaScript olmadan gezinmek mi? - peki, bunun yerine yürüyüşe de çıkabilirsin.
low_rents

yaklaşık 10 yıl sonra: aynı! veya?
toing_toing

18

Dosyaları arama motorlarından gizlemenin birçok yolunu gösteren güzel bir makale:

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

JavaScript, bir sayfayı dizine eklememek için iyi bir yol değildir; kullanıcıların dosyalarınıza doğrudan bağlanmasını (ve dolayısıyla tarayıcılara göstermesini) engellemeyecek ve Rob'un da bahsettiği gibi, tüm kullanıcılar için çalışmayacaktır.
Kolay bir düzeltme, rel="nofollow"özniteliği eklemektir , ancak yine de robots.txt olmadan tamamlanmadı.

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

2
Burada, "nofollow" veya "ben" ilişkisini anlamama çok yardımcı olan Web Yöneticileri için Google Yardım'ın başka bir makalesi var .
000

12

Evet, window.location.href'i indirmek istediğiniz dosyanın url'si ile değiştirmeniz gerekir.

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

ya dosya uzantısı .html ise, indirmek yerine o html dosyasına yönlendirecek
Kaleem Nalband

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

hata yok, sadece indirme başlamadı. Eleman oluştururken eksik olduğum bir nokta olabileceğini düşünüyorum.
shyammakwana.me

html'nizde bir <a> öğesinin oluşturulmuş olup olmadığını doğrulayın ve dosya bağlantınızı doğrulayın.
EL missaoui habib

vücutta bir etiket vardı. ve manuel tıklayarak görüntü indiriyor. ancak şimdi gerekli değil, bu vanillaJS çözümünü kullandım.
shyammakwana.me

Çalışmamak için hiçbir sebep yok, bağlantı doğru. bağlantıyı doğrudan göz
atarak

$('blah').each(function(){ $('body').append('<a href="'+xxx+'" download="'+dynamicname+'" />'); }) $('a').trigger('click');bunu kullandım.
shyammakwana.me

7
  • JQuery işlevini kullanma

        var valFileDownloadPath = 'http//:'+'your url';
    
       window.open(valFileDownloadPath , '_blank');

6

Belirterek window.location.href = 'uploads/file.doc';Dosyalarınızı depolamak nereye gösterir. Elbette .htacess'i depolanmış dosyalar için gerekli davranışı zorlamak için kullanabilirsiniz, ancak bu her zaman bir avuç olmayabilir ....

Sunucu tarafı php dosyası oluşturmak ve bu içeriği içine yerleştirmek daha iyidir:

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

Bu kod HERHANGİ bir dosyayı gerçekten nerede sakladığınızı göstermeden bir indirme olarak döndürecektir.

Bu php dosyasını şu yolla açarsınız: window.location.href = 'scripts/this_php_file.php?f=downloaded_file';


Bu çözüm, sitemdeki indirme sorunlarını çözmeme yardımcı oldu, teşekkürler!
Denniz

3

Gizli iframe'ler yardımcı olabilir


var redeemFrame = document.createElement ("iframe"); var src = "doDownload.php"; redeemFrame.setAttribute ( "src" src); redeemFrame.setAttribute ("stil", "display: yok"); document.body.appendChild (redeemFrame);
DarthRez

3

Click olayından ÖNCE adlı mousedown olayını kullanmanızı öneririm. Bu şekilde, tarayıcı tıklama olayını doğal olarak işler ve bu da herhangi bir kod tuhaflığını önler:

(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

Formları temizlemek için jQuery'yi kullanma hakkında benzer bir gönderi için buraya bakın: jQuery ile çok aşamalı bir formu sıfırlama

Ayrıca, değerlerin dikmeler değer yığını tarafından yeniden doldurulduğu bir sorunla karşılaşıyor olabilirsiniz. Diğer bir deyişle, formunuzu gönderirsiniz, eylem sınıfında ne yaparsınız, ancak eylem sınıfında ilgili alan değerlerini silmeyin. Bu senaryoda, form daha önce gönderdiğiniz değerleri koruyor gibi görünecektir. Bunları bir şekilde devam ettiriyorsanız, ısrar ettikten sonra ve BAŞARI döndürmeden önce eylem sınıfınızdaki her alan değerini sıfırlayın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.