Bir indirme başlatmak için en iyi yolu?

9 Cevap php

PHP tabanlı bir web sitesinde, ben onlar kısa formu doldurduktan sonra kullanıcılara indirme paketi göndermek istiyorum. Site başlatılan indir söylemek download.com gibi siteleri benzer olmalıdır "indirme bir anda başlayacak."

Birkaç possible approaches Bilmem, ve (hızlı test dayalı) tarayıcı uyumluluğu:

1) Do a window.open pointing to the new file.
*FireFox 3 blocks this.
*IE6 blocks this.
*IE7 blocks this.

2) Create an iframe pointing to the new file.
*FireFox 3 seems to think this is OK. (Maybe it's because I already accepted it once?)
*IE6 blocks this.
*IE7 blocks this.

En azından bu üç tarayıcılar itiraz olmaz ki ben bunu nasıl yapabilirim?

Bonus: Tarayıcı koşullu ifadeler gerektirmeyen bir yöntem var mıdır?

(Ben download.com şartlı iki yöntem kullanır inanıyorum, ama bir ya da çalışmak için alınamıyor.)

Responses and Clarifications:
Q: "Why not point the current window to the file?"
A: That might work, but in this particular case, I want to show them some other content while their download starts - for example, "would you like to donate to this project?"

UPDATE: I have abandoned this approach. See my answer below for reasons.

9 Cevap

Ayrıca çoğu tarayıcı destekleyen bir meta yenileme, yapabilirsiniz. Download.com bir noscript etiketi tane yerleştirir.

<meta http-equiv="refresh" content="5;url=/download.php?doc=123.zip"/>

Güncelle: Ben bu yaklaşımı terk etmeye karar verdi ve bunun yerine sadece gerçek dosyaya bir bağlantı ile kullanıcıya sunmak var. Benim akıl şudur:

Bir sunucu tarafından başlatılan indirmek benim ilk girişimleri tarayıcınız tarafından bloke edilmiştir. Bu beni düşünme var: ". Tarayıcısı hakkıdır Nasıl it Bu bir meşru karşıdan olduğunu biliyoruz Bu should Açıkçası kullanıcı başlatılan olmayan bir indirme blok?".

Ben bir sunucu tarafından başlatılan indirmek için kullanabileceğiniz herhangi bir yöntem also malware göndermek isteyen birisi tarafından kullanılabilir. Kullanıcı bunun için özel bir linke tıklayarak dosyayı istediğinde nedenle, indirme sadece gerçekleşmesi gerekir.

Sen katılmıyorum özgürsünüz, ve hala bir indirme başlatmak istiyorsanız, umarım bu konu bunu yardımcı olacaktır.

Ben genellikle sadece uygun bir Content-Type ile doğrudan tarayıcıya dosyayı çıkarır bir PHP komut dosyası var

if( file_exists($filename) ){
        header("Pragma:  public");
        header("Expires:  0");
        header("Cache-Control:  must-revalidate, pre-check=0");
        header("Cache-Control:  private", false);
        header("Content-Type:  " . $content-type);
        header("Content-Disposition:  attachment; filename=\"" . basename($filename) . "\";" );
        header("Content-Transfer-Encoding:  binary");
        header("Content-Length:  " . filesize($filename));

        readfile("$filename");
}else{
        print "ERROR:  the file " . basename($filename) . " could not be downloaded because it did not exist.";
}

Tek dezavantajı bu HTTP başlığını ayarlar beri başka çıkışı var önce, o çağrılacak aldığıdır.

Ama PHP indirme sayfasına bir bağlantı olabilir ve bu tarayıcı geçerli sayfanın içeriğini karışıklık olmadan bir indirme kutusu açılır neden olacaktır.

Bir catch başlıkları "doğru" kurmak değil eğer IE (özellikle sürüm 6) ile sorunlarla karşılaşabilirsiniz olmasıdır.

Eğer doğru Content-Type set sağlamak, aynı zamanda allow önbelleğe IE için Önbellek seçenekleri (en azından) ayarı düşünün. Bir dosya ise kullanıcının açmak yerine, onlar uygulanabilir uygulaması için "açık" isteği devredecektir olarak IE erken sürümleri indirilen dosyayı işaret, dosyayı önbelleğe gerekir (örneğin, bir MS Word belgesi) kaydedebilirsiniz önbellek.

Orada ilgili bir sorunu da bulunuyor IE6 kullanıcının önbelleği dolu ise yürürlükteki uygulamayı açmak için elini aldığında, düzgün böylece (dosyayı kaydetmek olmaz, bu dosya bozuk şikayet edecektir.

Ayrıca, (IE için) çok yüklemeler herhangi gzip eylemleri açmak isteyebilirsiniz

IE6/IE7 hem büyük indirme (örn. 4.x konserler ...) değil, bir olasılıkla IE bile bir indirme yöneticisi yok çünkü senaryo, ama farkında olmak bir şey ile sorunları var.

Iç içe geçmiş bir iframe içinde başlatılan Son olarak, IE6 bazen güzel bir indirme "itme" işlemez. Ben sorunu tetikleyen ne tam olarak emin değilim, ama ben bu senaryoyu önlemek için IE6 ile kolay bulabilirsiniz.

Nasıl yeni bir dosyaya işaret etmek konumunu değiştirme hakkında? (Örneğin, window.location değiştirerek)

Ben her zaman sadece dosyasına işaret eden bir iframe yaptık.

<iframe src="/download.exe" frameborder="0" height="0" width="0"><a href="/download.exe">Click here to download.</a></iframe>

Sadece özetlemek için, size 2 hedefleri var:

  1. indirme işlemini başlatmak
  2. Kullanıcıya bir bağış seçenekleri ile bir sayfa göstermek

Bunu başarmak için aşağıdaki yapardın:

When your user submits the form, he gets the resulting page with a donate options and a text saying that his download will start in 5 seconds. And in the head section of this page you put the META code as Soldarnal said: <meta http-equiv="refresh" content="5;url=/download.php?doc=123.zip>

Ve hepsi bu.

Hoi!

@Nathan: I decided to do exactly that: Have my "getfile.php" load all necessary stuff and then do a

header("Location: ./$path/$filename");

tarayıcının kendisi izin ve doğrudan düşündüğünü ne yapmak için doğru dosya ile yapmak. Bu bile benimle Opera'da çalışıyor.

Dosyalara doğrudan erişim izni olduğu ancak bu ortamlarda bir sorun olacak, bu durumda farklı bir yol bulmak zorunda kalacak! (Benim dosyalarım kamu PDF'leri vardır Discordia ederiz!)

Saygılarımızla, Basty

<a href="normaldownload.zip" onclick="use_dhtml_or_ajax_to_display_page()">

Indir kayıtlı ise Current page etkilenmez. Sadece bu indirme aynı pencerede (doğru MIME türü veya Content-Disposition) açılmıyor sağlamak ve bir şey göstermek mümkün olacak.

See more complete answer