SORU
1 EKİM 2008, ÇARŞAMBA


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
1 EKİM 2008, ÇARŞAMBA


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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Blunty

    Blunty

    13 Mart 2006
  • GOTO Conferences

    GOTO Confere

    3 EKİM 2011
  • Roger Huffman

    Roger Huffma

    4 ŞUBAT 2007