PHP Dosya İndirme Sorular

2 Cevap php

Şu anda kullanıcının benim sunucuda depolanan bir dosya indirme ile bazı sorunlarla çalıştırıyorum. Ben kodu kullanıcı download butonuna vurur kez bir dosyayı indirmek auto kurdunuz. Tüm dosyalar için çalışıyor, ancak boyutu almak en büyük 30 MB'den bu sorunları sahip olduğunda. Kullanıcı download bir sınırı var mı? Ayrıca, benim örnek kod sağladığınız ve PHP işlevin 'file_get_contents' kullanarak daha iyi bir uygulama olup olmadığını merak ediyorum.

Yardım için teşekkür ederiz!

$path = $_SERVER['DOCUMENT_ROOT'] . '../path/to/file/';
$filename = 'filename.zip';
$filesize = filesize($path . $filename);
@header("Content-type: application/zip");
@header("Content-Disposition: attachment; filename=$filename");
@header("Content-Length: $filesize")
echo file_get_contents($path . $filename);

2 Cevap

file_get_contents() belleğe tüm dosyayı yüklemek olacak - bunun bir günlüğünü kullanarak.

Ve, PHP, bir komut dosyası kullanılabilir bellek miktarı sınırlıdır (see memory_limit ) - hangi indirme komut büyük dosyalar için çalışmıyor açıklayabilir .


Using readfile(), instead, might be a better choice : it will read the file, and directly send its content to the output buffer.

Bu şu anlama gelir:

  • Belleğe tüm dosya yüklenmiyor
  • Bellekte yüklü ettik içeriği yankı zorunda değil.

Sadece bu gibi bir şey kullanarak Tamam olmalıdır:

$path = $_SERVER['DOCUMENT_ROOT'] . '../path/to/file/';
$filename = 'filename.zip';
$filesize = filesize($path . $filename);
@header("Content-type: application/zip");
@header("Content-Disposition: attachment; filename=$filename");
@header("Content-Length: $filesize")
readfile($path . $filename);


(BTW : do you really want to silence errors this way, with the @ operator ? Another solution could be to not display them, but log them to a file -- see display_errors, log_errors, and error_log)

file_get_contents() PHP VM dosya içeriğini çeker. readfile() okumadan dosya akışı için kullanın.