php点链接直接现在文件吗,PHP实现点击a标签的href做链接时,直接保存文件(任何类型),而...
一、 index.php中: ?php echo a href='process.php?filename=halo.mp3'下載/a? process.php中: ?php header(Content-type: application/octet-stream);header('Content-Disposition: attachment; filename='. basename($_GET['filename']).'');header(Cont
一、
index.php中:
echo "下載"
?>
process.php中:
header("Content-type: application/octet-stream");
header('Content-Disposition: attachment; filename="'. basename($_GET['filename']).'"');
header("Content-Length: ". filesize($_GET['filename']));
readfile($_GET['filename']);
?>
這是最簡單的方法,但是有個問題:如果請求的路徑中包含中文,那么下載的文件名有可能就是亂碼。
二、
針對上面問題的解決方案,index.php中:
echo "下載"
?>
process.php中:
header("Content-type: application/octet-stream");
//處理中文文件名
$ua = $_SERVER["HTTP_USER_AGENT"];
$encoded_filename = urlencode($_GET['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''" . $_GET['filename'] . '"');
} else {
header('Content-Disposition: attachment; filename="' . $_GET['filename'] . '"');
}
header("Content-Length: ". filesize($_GET['filename']));
readfile($_GET['filename']);
?>
輸出的時候,如果是Apache+PHP,那么還需要發送到Apache的輸出緩沖區,最后才發送給用戶。而對于Nginx+fpm,如果它們分開部署的話,那還會帶來額外的網絡IO。
三、
現在貌似沒有問題了,但是readfile還是有問題的,雖然PHP的readfile嘗試實現的盡量高效,不占用PHP本身的內存,但是實際上它還是需要采用MMAP(如果支持),或者是一個固定的buffer去循環讀取文件,直接輸出。
那么能不能繞過PHP這層呢,直接由webserver把文件發送給用戶呢?可以的,我們可以使用Apache的module mode_xsendfile,讓Apache直接發送這個文件給用戶。
代碼實現如下:(process.php)
header("Content-type: application/octet-stream");
//處理中文文件名
$ua = $_SERVER["HTTP_USER_AGENT"];
$encoded_filename = urlencode($_GET['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''" . $_GET['filename'] . '"');
} else {
header('Content-Disposition: attachment; filename="' . $_GET['filename'] . '"');
}
//讓Xsendfile發送文件
header("X-Sendfile: $_GET['filename']");
最后,如果愿意的話,可以先判斷后綴,因為有時候圖片當成文件下載也會引起一些不方便的:
$type = strrchr($_GET['filename'], "."); //獲取后綴
if($type == "jpg" || "png" || "gif"){
header("Content-Disposition: filename=$_GET['filename']"); //這里我試過,加引號的話,下載時會加到文件名中
header("Content-Type: image/$type");
}
總結
以上是生活随笔為你收集整理的php点链接直接现在文件吗,PHP实现点击a标签的href做链接时,直接保存文件(任何类型),而...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux c 子线程sleep,lin
- 下一篇: c语言微信备份文件,文件保存后自动刷新微