php隐藏真实的文件下载地址的多个方法

发布时间:2020-03-15编辑:脚本学堂
在php文件下载的功能实现中,如何隐藏文件的真实地址呢?这里分享几种php隐藏实际地址的文件下载方法,不显示实际的文件下载地址,注意这几个方法在隐藏文件地址上有什么不同。

php隐藏文件下载地址的方法

一、php隐藏文件下载的实际地址。

不显示实际的文件下载地址。
 

复制代码 代码示例:
function download_document($filename,$path="",$mimetype="application/octet-stream")
{
  header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
  header("Content-Disposition: attachment; filename = $filename");
  header("Content-Length: " . filesize($pathto . $filename));
  header("Content-Type: $mimetype");
  echo file_get_contents($pathto . $filename);
}

二、php隐藏真实的文件下载地址

例1,隐藏真实的文件下载地址。

复制代码 代码示例:
<? 
$file_name = "info_check.exe"; 
$file_dir = "/public/www/download/"; 
 
//检查文件是否存在 
if(!file_exists($file_dir . $file_name)) exit('文件找不到'); 
else  

$file = fopen($file_dir . $file_name,"r"); // 打开文件 
 
// 输入文件标签 
Header("Content-type: application/octet-stream"); 
Header("Accept-Ranges: bytes"); 
Header("Accept-Length: ".filesize($file_dir . $file_name)); 
Header("Content-Disposition: attachment; filename=" . $file_name); 
 
// 输出文件内容 
echo fread($file,filesize($file_dir . $file_name)); 
fclose($file); 
exit; 

?> 
 

 
例2,文件路径是“http”或者“ftp” 网址,修改代码为:
 

复制代码 代码示例:
<?
//隐藏真实的文件下载地址
$file_name = "info_check.exe"; 
$file_dir = "http://www.dgjs123.com/"; 
$file = @ fopen($file_dir . $file_name,"r"); 
 
if (!$file) exit('文件找不到'); 
else { 
Header("Content-type: application/octet-stream"); 
Header("Content-Disposition: attachment; filename=" . $file_name); 
while (!feof ($file)) { 
echo fread($file,50000); 

fclose ($file); 

?>

三、php隐藏文件的真实路径并实现文件下载功能

代码:
 

复制代码 代码示例:

<?php
/**
 * 下载文件
 * @param string $file
 *   被下载文件的路径
 * @param string $name
 *   用户看到的文件名
 */
function download($file,$name=''){
$fileName = $name ? $name : pathinfo($file,PATHINFO_FILENAME);
$filePath = realpath($file);

$fp = fopen($filePath,'rb');

if(!$filePath || !$fp){
header('HTTP/1.1 404 Not Found');
echo "Error: 404 Not Found.(server file path error)<!-- Padding --><!-- Padding --><!-- Padding --><!-- Padding --><!-- Padding --><!-- Padding --><!-- Padding --><!-- Padding --><!-- Padding --><!-- Padding --><!-- Padding --><!-- Padding --><!-- Padding --><!-- Padding -->";
exit;
}

$fileName = $fileName .'.'. pathinfo($filePath,PATHINFO_EXTENSION);
$encoded_filename = urlencode($fileName);
$encoded_filename = str_replace("+", "%20", $encoded_filename);

header('HTTP/1.1 200 OK');
header( "Pragma: public" );
header( "Expires: 0" );
header("Content-type: application/octet-stream");
header("Content-Length: ".filesize($filePath));
header("Accept-Ranges: bytes");
header("Accept-Length: ".filesize($filePath));

$ua = $_SERVER["HTTP_USER_AGENT"];
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 . '"');
}

// ob_end_clean(); <--有些情况可能需要调用此函数
// 输出文件内容
fpassthru($fp);
fclose($fp);
exit;
}