PHP dosya göndermek için kullanırken indirmeleri devam ettirilebilir?
İndirilebilir dosya için tam yolu göstermek istemiyoruz beri dosya indirme tünel için bir PHP komut dosyası kullanarak
header("Content-Type: $ctype");
header("Content-Length: " . filesize($file));
header("Content-Disposition: attachment; filename=\"$fileName\"");
readfile($file);
Ne yazık ki popülerlik bu komut, üzerinden geçti, son kullanıcı tarafından devam edilebilir mi fark ettik.
Böyle bir PHP tabanlı bir çözüm ile yeniden birleştirmek indir destek için herhangi bir yolu var mı?
CEVAP
Yapmanız gereken ilk şey, kısmi içeriği destekleyen istemci anlatmak için tüm yanıtları Accept-Ranges: bytes
Başlığı, göndermektir. O zaman, eğer isteği ile bir Range: bytes=x-y
başlık aldı (x
y
varlık sayı) ayrıştırılamadı aralığı müşteri talep, dosyayı aç, her zamanki gibi, arama x
bayt ileri ve Gönder sonraki y
- x
bayt. Ayrıca HTTP/1.0 206 Partial Content
yanıt ayarlayın.
Her şeyi test etmeden, bu, daha fazla veya daha az işe yarayabilir:
$filesize = filesize($file);
$offset = 0;
$length = $filesize;
if ( isset($_SERVER['HTTP_RANGE']) ) {
// if the HTTP_RANGE header is set we're dealing with partial content
$partialContent = true;
// find the requested range
// this might be too simplistic, apparently the client can request
// multiple ranges, which can become pretty complex, so ignore it for now
preg_match('/bytes=(\d )-(\d )?/', $_SERVER['HTTP_RANGE'], $matches);
$offset = intval($matches[1]);
$length = intval($matches[2]) - $offset;
} else {
$partialContent = false;
}
$file = fopen($file, 'r');
// seek to the requested offset, this is 0 if it's not a partial content request
fseek($file, $offset);
$data = fread($file, $length);
fclose($file);
if ( $partialContent ) {
// output the right headers for partial content
header('HTTP/1.1 206 Partial Content');
header('Content-Range: bytes ' . $offset . '-' . ($offset $length) . '/' . $filesize);
}
// output the regular HTTP headers
header('Content-Type: ' . $ctype);
header('Content-Length: ' . $filesize);
header('Content-Disposition: attachment; filename="' . $fileName . '"');
header('Accept-Ranges: bytes');
// don't forget to send the data too
print($data);
Çok belirgin bir şey kaçırmış olabilir, ve kesinlikle bazı hataları potansiyel kaynaklarını görmezden geldim, ama bu bir başlangıç olmalı.
description of partial content here ve fread Dokümantasyon sayfasında kısmi içerik hakkında biraz bilgi buldum.
Ruby: parçalı olarak HTTP üzerinden bi...
Ön/UÇ dosya nesneleri geri göndermek i...
Nasıl CURL ile veri belirtilen POST is...
Nasıl bir proje içinde tek bir dosya i...
Takibi bırak ve Git içinde bir dosya i...