PHP indir yazısı ile doğru dosya boyutunu gönderme

2 Cevap php

PHP bir dosya indirme komut dosyası oluşturulur, çalışır, ama web tarayıcılarının "Bilinmeyen Uzunluk" olarak dosyayı bildirmek. Aşağıdaki gibi benim kod:

function downloadFile($file){
  // Set up the download system...
  header('Content-Description: File Transfer');
  header('Content-Type: '.mime_content_type($file));
  header('Content-Disposition: attachment; filename="'.basename($file).'"');
  header('Content-Transfer-Encoding: binary');
  header('Expires: 0');
  header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
  header('Pragma: public');
  header('Content-Length: '.filesize($file));

  // Flush the cache
  ob_clean();
  flush();

  // Send file to browser
  readfile($file);

  // DO NOT DO ANYTHING AFTER FILE DOWNLOAD
  exit;
}

2 Cevap

Başlangıçta gelen http://paul.luminos.nl/update/471:

CrimsonBase website his article about PHP-controlled file downloads Andrew Johnson tarafından yayınlanan benzer bir sağlam bir PHP komut dosyası geçirerek indirme doğrular.

Andrew makalenin sonunda çok önemli yorumu yapar:

"Eğer Zlib, mod_deflate ile dosyaları sıkıştırmak ve görme bitireceğiz öylesine Content-Length başlığına doğru olmayacaktır" Eğer kalan Bilinmeyen boyutu "ve" Bilinmeyen zaman "dosyaları indirirken zaman."

Ben bu vurgulamak istiyorum: tarayıcı komut özellikle Content-Length-Apache'nin mod_deflate uzantısının etkin olduğunu oldukça muhtemeldir sizin PHP tarafından oluşturulan başlıkları itaat edilecek görünmüyor .

Kolayca uygulanabilir bir .htaccess dosyasına aşağıdaki satırı kullanarak tek bir komut dosyası için devre dışı bırakabilirsiniz:

SetEnvIfNoCase Request_URI ^/download\.php no-gzip dont-vary

download.php Burada sunucunun kök dizin yolunda yer alan indirme komut olduğu varsayılır nerede (örneğin www.crimsonbase.com/download.php). (Düzenli ifade değildir, çünkü o ^/download\.php.)

Readfile () fonksiyonundan önce önbelleği kızarma çalışın. Benim kod aksi halde sizin için hemen hemen aynıdır ve gayet iyi çalışıyor.