一般的に言えば、ドキュメント ルートの下にあるファイルへの URL を直接指定することで、ユーザーにファイルをダウンロードさせることができます。
ただし、これを行うと、統計や権限チェックなどを行うことができなくなります。そのため、多くの場合、PHP を使用して転送を行い、ユーザーにファイルのダウンロードを提供します
コードをコピーしますコードは次のとおりです:
$file = "/tmp/dummy.tar.gz";
header("Content-type: application/octet-stream");
header('Content-Disposition :attachment; filename ="' .basename($file) . '"');
header("Content-Length: ". filesize($file));
readfile($file);
しかし問題がありますこれで、つまり、ファイルが中国語の名前の場合、一部のユーザーはダウンロード後にファイル名が文字化けする可能性があります。
それでは、いくつかの変更を加えてみましょう:
コードをコピーします コードは次のとおりです:
$file = "/tmp/中文名.tar.gz";
$filename =basename($ file);
header("Content-type: application/octet-stream");
//中国語ファイル名の処理
$ua = $_SERVER["HTTP_USER_AGENT"];
$encoded_filename = rawurlencode( $filename);
if (preg_match("/MSIE/", $ua)) {
header('Content-Disposition:attachment; filename="' . $encoded_filename . '"');
} else if (preg_match( "/Firefox/ ", $ua)) {
header("Content-Disposition:attachment; filename*="utf8''" . $filename . '"');
} else {
header('Content-Disposition: Attachment; filename= "' . $filename . '"');
}
header("Content-Length: ". filesize($file));
readfile($file);
まあ、見た目はかなり良くなりましたPHP の readfile は可能な限り効率的であり、PHP 自体のメモリを占有しないように努めていますが、実際には MMAP (サポートされている場合) または固定バッファを使用する必要があります。ループでファイルを直接出力します。
出力する場合、Apache + PHP mod の場合は、Apache の出力バッファに送信する必要があります。Nginx + fpm の場合、それらが別々にデプロイされている場合は、追加のネットワークももたらします。イオ
それでは、WebサーバーはPHP層を経由せずにユーザーにファイルを直接送信できますか?
今日、興味深い記事を見つけました: How I PHP: X-SendFile.
Apache のモジュール mod_xsendfile を使用して、Apache がこのファイルをユーザーに直接送信できるようにします:
コードをコピーします コードは次のとおりです:
$file = "/tmp/中文名.tar.gz ";
$filename = basename($file);
header("Content-type: application/octet-stream");
//中国語のファイル名を処理します
$ua = $_SERVER[" HTTP_USER_AGENT"];
$encoded_filename = rawurlencode($filename);
if (preg_match("/MSIE/", $ua)) {
header('Content-Disposition:attachment; filename="' . $encoded_filename . '" ');
} else if (preg_match("/Firefox/", $ua)) {
header("Content-Disposition:attachment; filename*="utf8''" . $filename . '"');
} else {
header ('Content-Disposition:attachment; filename="' . $filename . '"');
}
//Xsendfile にファイルを送信させます
header("X-Sendfile: $file");
X-Sendfile ヘッダー Apache によって処理され、応答ファイルはクライアントに直接送信されます。
Lighttpd と Nginx にも同様のモジュールがありますので、興味があればチェックしてみてください
http://www.bkjia.com/PHPjc/779166.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/779166.html技術記事一般的に、ドキュメント ルートの下にあるファイルへの URL を直接指定することで、ユーザーにファイルをダウンロードさせることができます。ただし、この方法では、統計や権限のチェックを行う方法はありません...
。