4

ダウンロードをストリーミングして、サーバーからファイルをダウンロードしようとしています。

これは私のスクリプトです:

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は私が実際に使用しているものではなく、実際のURLを表示したくなかっただけです。:) Webブラウザでこのファイルにアクセスすると、ダウンロードプロンプトが表示されず、何も起こりません。$r[2]はファイルのコンテンツの長さ(バイト単位)であり$fileName、添付ファイルヘッダーで使用されているものと同じURLです。何が間違っているのか本当にわかりません。

4

4 に答える 4

5

readfile(); URLではなくマシン上のファイルの絶対パスが必要です。

例:/home/person/file.exe

于 2009-12-07T17:51:52.580 に答える
0

)ファイル名のヘッダー行の最後に欠落がありますが、行を編集したときに発生したと思います。

価値のあることとして、サンプルコードを実行するとダウンロードプロンプトが表示され、それを超えて実際にテストしたことはありませんが、コードではなく、サーバー/クライアント構成に問題がある可能性があります。

于 2009-12-07T17:52:56.403 に答える
0

私見の問題はファイルサイズです。httpを介してファイルサイズを取得してみてください(この関数を見てください): http ://codesnippets.joyent.com/posts/show/1214

だから編集

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

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

あなたがあなたの問題を解決することを望みます。

于 2011-05-19T10:02:05.527 に答える
0

たとえば、画像をダウンロードする方法を見つけましたが、これはあらゆる種類のファイルに役立ちます。を使用せずにファイルをダウンロードしますreadfile

不器用なこともありますが、作業を完了するためにいくつかの回避策が必要になる場合があります。

これを試してみてください$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;

これはテストされ、機能しています;-)

于 2012-12-27T00:01:35.580 に答える