Uzak sunucu PHP readfile header

2 Cevap php

Sitemin bu kodu kullanarak, bir dosya indirme nedir:

$flv = **filename**

$ch = curl_init($flv);
curl_setopt($ch, CURLOPT_NOBODY, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); //not necessary unless the file redirects (like the PHP example we're using here)
$data = curl_exec($ch);

curl_close($ch);
if ($data === false) {
  echo 'cURL failed';
  exit;
}

$contentLength = 'unknown';
if (preg_match('/Content-Length: (\d+)/', $data, $matches)) {
  $contentLength = (int)$matches[1];
}

header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename($flv));
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: ' . $contentLength );
ob_clean();
flush();
readfile($flv);

Kodu indirmek bitirmek için bekleyen, indir tek sayfa bloqued olan bağlantıları bitene kadar, ama çalışıyor!

Ben ne yapabilirim?

2 Cevap

ile deneyin:

$ContentLength = filesize($flv);

header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename($flv));
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: ' . $ContentLength);

$fh = fopen($flv, 'r');
echo fread($fh, $ContentLength);
fclose($fh);

Nasıl bu sayfaya bağlantı veriyor. Bu kullanıcı nerede dosyayı indirmek veya indirmeyi iptal etmek seçmek için izin veren kalıcı bir pencere açılır beri Tabii ki bir indirme sayfasında her şeyi engeller. Bu bir tarayıcı özelliği.

Başka bir şey hakkında konuşurken, lütfen açıklayınız.


Edit:

Which download are you referring to? There are two downloads here. One is the server to server download of the file using CURL. The other is the download of that same file by the HTTP client from your server. Both can be "fixed" but you have to be specific.

Eğer CURL indirme otomatik olmak istiyorsanız, o zaman indirme ayrı bir süreç olduğunu yapmak zorunda. Ne yazık ki PHP normalde sadece tek bir süreci destekler, böylece standart dışı PHP kullanmak zorunda.

Olasılıklar:

1) Shell'e kullanın

exec ('php filename.php downloadfile.ext &');

Here you send the PHP script filename.php an argument download.ext. The whole process will be executed in the background due to the & at the end of the command. Do a var_dump($argv); to see the arguments passed.

Ayrıca aynı şeyi süreç boru kullanabilirsiniz:

örneğin: poopen () proc_open ()

Onlar biraz daha fazla kontrol sağlar.

2) You can also install one of the process control extensions. http://php.net/manual/en/refs.fileprocess.process.php

Bu, sunucuya dosya indirme işlemek woudl PHP komut ayrı bir süreç çatal sağlayacak. Eğer ayrı bir süreçte oluyor ne izlemenize izin verir arası işlem iletişim (IPC) uzantıları da vardır.

3) indirme işlemek için bir deamon yazabilirsiniz. Temelde, aynı zamanda bir seferde birden fazla indirme yapmak için sizin deamon birden süreçlerini işlemek gerekir. Daha sonra bir kez aynı kaynak karşıdan kalmamak Ayrıca IPC biraz ya da eşzamanlılık en azından çeşit gerekir. Biraz karmaşık alıyorum Thats yüzden 1 ve 2 daha iyi seçenekler olduğunu düşünüyorum.


Temelde ne yapmaya çalışıyoruz burada sunucu indirmek için sunucu için bekleyen kullanıcıyı durdurmak.

So you start out with the main PHP process (the normal PHP page). Then you fork the process somehow. Have that child process download the file using CURL. In the meantime, the parent PHP process returns immediately to the HTTP client. When the child has finished donwloading, the parent process can either know via IPC, or by polling a concurrent resource, such as the filename (or filesize, or lock) of the downloaded file. It then serves this to the HTTP client.


Sorunun HTTP Client ile ise, o zaman bir tarayıcı çözüm bakıyor gerekecek. Vb, vb, ile test ediyoruz tam tarayıcı verilen sorun üzerinde bir fikir verecek.