日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > php >内容正文

php

php点链接直接现在文件吗,PHP实现点击a标签的href做链接时,直接保存文件(任何类型),而...

發(fā)布時間:2024/7/19 php 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 php点链接直接现在文件吗,PHP实现点击a标签的href做链接时,直接保存文件(任何类型),而... 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、 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,那么還需要發(fā)送到Apache的輸出緩沖區(qū),最后才發(fā)送給用戶。而對于Nginx+fpm,如果它們分開部署的話,那還會帶來額外的網(wǎng)絡(luò)IO。

三、

現(xiàn)在貌似沒有問題了,但是readfile還是有問題的,雖然PHP的readfile嘗試實(shí)現(xiàn)的盡量高效,不占用PHP本身的內(nèi)存,但是實(shí)際上它還是需要采用MMAP(如果支持),或者是一個固定的buffer去循環(huán)讀取文件,直接輸出。

那么能不能繞過PHP這層呢,直接由webserver把文件發(fā)送給用戶呢?可以的,我們可以使用Apache的module mode_xsendfile,讓Apache直接發(fā)送這個文件給用戶。

代碼實(shí)現(xiàn)如下:(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發(fā)送文件

header("X-Sendfile: $_GET['filename']");

最后,如果愿意的話,可以先判斷后綴,因?yàn)橛袝r候圖片當(dāng)成文件下載也會引起一些不方便的:

$type = strrchr($_GET['filename'], "."); //獲取后綴

if($type == "jpg" || "png" || "gif"){

header("Content-Disposition: filename=$_GET['filename']"); //這里我試過,加引號的話,下載時會加到文件名中

header("Content-Type: image/$type");

}

總結(jié)

以上是生活随笔為你收集整理的php点链接直接现在文件吗,PHP实现点击a标签的href做链接时,直接保存文件(任何类型),而...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。