ただし、これを行うと、統計や権限チェックなどを行うことができなくなります。そのため、多くの場合、PHP を使用して転送を行い、ユーザーにファイルのダウンロードを提供します
コードをコピーします。
$file = "/tmp/dummy.tar.gz";
header("Content-type: application/octet-stream");性質: filename= "' .basename($file) . '"');
readfile($file);これには問題があります。つまり、ファイルが中国語の名前の場合、ファイル名が文字化けしてダウンロードされる可能性があります
そこで、いくつかの修正を加えてみましょう (参考: :
コードをコピーします
)。コードは次のとおりです:
$file = "/tmp/中国語名.tar.gz"; $filename =basename($file);
header("Content-type: application/octet -stream");
//中国語ファイル名の処理
$ua = $_SERVER["HTTP_USER_AGENT"];
$encoded_filename = urlencode($filename);
$encoded_filename = str_replace("+", "%20" , $encoded_filename);
if (preg_match("/MSIE/", $ua )) {
header('Content-Disposition:attachment; filename="' . $encoded_filename . '"'); ("/Firefox/", $ua)) {
header("Content-Disposition:attachment; filename*="utf8''" . $filename . '"')
} else {
header('Content-Disposition : 添付ファイル名="' . $ファイル名 . '"');
}
header('Content-Disposition: 添付ファイル; ファイル名="' . $ファイル名 . '"');
ヘッダー("コンテンツの長さ: " . filesize($file));
readfile($file);
さて、見た目はかなり良くなりましたが、まだ問題があり、それは PHP の readfile が可能な限り効率的であるように努めています。 PHP 自体のメモリを占有しない、実際には MMAP (サポートされている場合) を使用する必要がある、または、ループでファイルを読み取り、直接出力するために固定バッファーが使用されます
Apache + PHP mod の場合、出力時に、最後に、Nginx + fpm の場合は、追加のネットワーク IO ももたらすため、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 = urlencode($filename);
$encoded_filename = str_replace("+", "%20", $encoded_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-Disposition:attachment; .basename($file).'"');
//Xsendfile にファイルを送信させます
X-Sendfile ヘッダーは Apache によって処理され、応答ファイルはクライアントに直接送信されます
Lighttpd と Nginx にも同様のモジュールがありますので、興味がある場合はチェックしてください。
http://www.bkjia.com/PHPjc/325558.html
www.bkjia.com
true
http://www.bkjia.com/PHPjc/325558.html技術記事
ただし、これを行うと、統計や権限チェックなどを行うことができなくなります。そのため、多くの場合、PHP を使用して転送を行い、ユーザーにファイルのダウンロードを提供します。