PHP kullanarak bir dosyayı indirmek için zorlamak

8 Cevap php

Bir linke tıkladığında indirmek gerekiyorsa, benim sunucuda bir CSV dosyası var, ama bunun yerine benim tarayıcı penceresinde açılır.

Benim kod aşağıdaki gibidir görünüyor

 <a href="files/csv/example/example.csv" class="pagination">Click here to download an example of the "CSV" file</a>

Ben benim dev işin tümüne sahip bir web sunucusu normal bir web sunucusu bulunuyor.

Ben gibi Someting çalıştı

 <a href="files/csv/example/csv.php" class="pagination">Click here to download an example of the "CSV" file</a>

Benim csv.php dosyanın ŞİMDİ içeriği:

header('Content-Type: application/csv');
header('Content-Disposition: attachment; filename=example.csv');
header('Pragma: no-cache');

Şimdi benim sorun o indiriyor ama benim CSV yeni bir dosya yaratıyor dosya değildir.

8 Cevap

. seni indirmek için sunucu üzerindeki tüm CSV Kullanıcı kaba kuvvet için htaccess dosyasına bu ekleyebilirsiniz:

AddType application/octet-stream csv

EDIT (an inline solution within your php file would be more like this):

header('Content-Type: application/csv');
header('Content-Disposition: attachment; filename=example.csv');
header('Pragma: no-cache');
readfile("/path/to/yourfile.csv");

Onu almak için davet edildi, bir URL ile ne karar tarayıcısına kadar olduğundan bu, güvenilir yapılamaz.

You can suggest, bir Content-eğilim başlığını göndererek hemen "diske kaydetmek" için sunmalıdır tarayıcı:

header("Content-disposition: attachment");

Ben bu çeşitli tarayıcılar tarafından desteklenen ne kadar iyi emin değilim. Alternatif uygulama / octet-stream bir Content-type göndermek için, ama bu (temelde "Ben bu dosyanın ne tür söylemiyorum" ve aslında bağlı tarayıcıyı söylüyorsun kesmek çoğu tarayıcılar sonra bir indirme penceresi sunuyor) ve iddia edilen Internet Explorer ile sorunlara neden olacaktır.

Web Authoring FAQ. bu konuda daha fazla oku

(Ayrıca bu yapabileceğiniz bazı gizemli Apache ayarlar geçerli olmadığı sürece) İçerik-eğilim başlığı ayarlamak için gerekli olan - Edit Zaten verileri sunmak için bir PHP dosyası ile açık ettik. Bu PHP dosyası CSV dosyasının içeriğini okumak ve bunları yazdırmak için şimdi yapmak için sol bütün olduğunu - filename=example.csv başlığında sadece dosya için kullanmak istemci tarayıcısına ne isim önerir, öyle aslında sunucuda dosyadan veri almak değil.

Medya türü ile dosya göndermek için sunucu yapılandırın application/octet-stream.

Güzel temiz Çözümü.

<?php
    header('Content-Type: application/download');
    header('Content-Disposition: attachment; filename="example.csv"');
    header("Content-Length: " . filesize("example.csv"));

    $fp = fopen("example.csv", "r");
    fpassthru($fp);
    fclose($fp);
?>

Yoksa HTML5 kullanarak bunu yapabilirsiniz. Basitçe ile

<a href="example.csv" download>download not open it</a>

Burada daha tarayıcı güvenli bir çözümdür:

    $fp = @fopen($yourfile, 'rb');

    if (strstr($_SERVER['HTTP_USER_AGENT'], "MSIE"))
{
	header('Content-Type: "application/octet-stream"');
	header('Content-Disposition: attachment; filename="yourname.file"');
	header('Expires: 0');
	header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
	header("Content-Transfer-Encoding: binary");
	header('Pragma: public');
	header("Content-Length: ".filesize($yourfile));
}
else
{
	header('Content-Type: "application/octet-stream"');
	header('Content-Disposition: attachment; filename="yourname.file"');
	header("Content-Transfer-Encoding: binary");
	header('Expires: 0');
	header('Pragma: no-cache');
	header("Content-Length: ".filesize($yourfile));
}

fpassthru($fp);
fclose($fp);

Bu tarayıcı bu dosya türünü işleyebilir anlamına gelmektedir.

Eğer beğenmezseniz, en kolay yöntem zip dosyaları sunan olacaktır. Herkes zip dosyaları işleyebilir ve bunlar varsayılan olarak indirilebilir.

Bu sayfada bir önceki cevabı indirmek için belirli bir türdeki tüm dosyaları zorlamak için. Htaccess nasıl kullanılacağı açıklanır. Ancak, çözüm, tüm tarayıcılar arasında tüm dosya tipleri ile çalışmıyor. Bu daha güvenilir bir yoldur:

<FilesMatch "\.(?i:csv)$">
  ForceType application/octet-stream
  Header set Content-Disposition attachment
</FilesMatch>

Eğer bu doğru çalışma görmek için tarayıcınızın önbelleğini temizlemek gerekebilir.