readfile düzgün çalışmıyor

4 Cevap php

Ben indir akarsu tarafından, bana benim sunucu üzerinden bir dosya indirmek için çalışıyorum.

Bu benim senaryom:

header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=http://user:pass@example.com/file.bin';
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: ' . $r[2]);
ob_clean();
flush();
readfile($fileName);
exit;

example.com Gerçekten istimal ne değildir, ben sadece gerçek URL'yi göstermek istemiyordu. :) Benim web tarayıcısında bu dosyaya gittiğinizde bir indirme istemi gelmiyor ve hiçbir şey olmuyor. $r[2] içerik uzunluğu dosyanın bayt olduğunu ve $fileName eki başlığında kullanılan aynı URL. Gerçekten ben yanlış yapıyorum bilmiyorum.

4 Cevap

readfile (); yerine bir url daha makinede dosyanın göreli yolunu gerekiyor.

örneğin / Home / kişi / file.exe

Orada eksik ) dosya başlık hattının sonunda, ama çizgiyi düzenlenmiş zaman bu oldu varsayarak yaşıyorum.

Bu değer ne için, sizin örnek kod çalıştıran gerçekten çok geçmiş test etmemiş, bir indir istemini verir, ama belki de sunucu / istemci yapılandırması ile bir şey - kodu değil.

IMHO the problem is the filesize, try karşı get the filesize over http (look at this function): http://codesnippets.joyent.com/posts/show/1214

Yani düzenlemek

header('Content-Length: ' . $r[2]);

karşı

header('Content-Length: ' . get_remote_file_size($fileurl) );

Eğer sorunu çözmek umuyoruz.

Ben örneğin bir görüntü indirmek için bir yol bulundu, ancak bu her türlü dosya ile yardımcı olabilir. Bu readfile kullanmadan bir dosya indirir.

Ben beceriksiz olabilir biliyorum ama bazen işi halletmek için bazı geçici çözümler gerekiyor.

Bu deneyin, burada $src = 'http://external-server/remote-image.jpg'

$url_stuff = parse_url($src); 
$port = isset($url_stuff['port']) ? $url_stuff['port'] : 80; 
$fp = fsockopen($url_stuff['host'], $port); 
$query  = 'GET ' . $url_stuff['path'] . " HTTP/1.0\n"; 
$query .= 'Host: ' . $url_stuff['host']; 
$query .= "\n\n"; 
$buffer=null;
fwrite($fp, $query); 
while ($tmp = fread($fp, 1024)) 
{ 
    $buffer .= $tmp; 
} 

preg_match('/Content-Length: ([0-9]+)/', $buffer, $parts); 
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=your_file.bin');
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');

$content = substr($buffer, - $parts[1]); 
echo $content;

Bu test ve çalışma ;-) edilir