php 获取文件给用户下载,使用PHP让用户在指定页面下载文件

一般各大网站提供下载的地方,要么是自己网站服务器,要么百度云、360云等。但是如果自己想放自己的服务器上怎么办呢?一般很正常的就是放在web服务器目录下,用a标签去链接,就能直接下载了,但是别人就可以拿到这个链接自己到处乱发怎么办呢?并且只允许别人下载页面只能够在我自己的网站上面下载呢?

我之前提供下载的地方是 dl.acgxt.com 加上一些参数,但是要想拿到真实的下载地址呢?拿到也下不了...我在下载页面上设置了session才能够下载,首先我们得做一个php的下载文件(download.php),然后使用ajax去获取session,然后在去访问download.php返回文件即可完成。

format,png

红色框里表示的是下载文件访问的路径

由于设置了session验证,所以如果直接去访问这个地址就会给出一个错误。

format,png

HTML

$(function(){

$("#download").click(function(){

var fileName = $("#fileName").val();

$.ajax({

url:"download.php",

type:"get",

dataType:"json",

data:{

file:fileName

},

success:function(data){

if(data['error']=='0'){

window.location.href="download.php?dl="+fileName

}else{

alert(data['meta']);

}

}

})

})

})

download.php

session_start();//开启session

$file_dir = "download/";//文件储存目录

if (isset($_GET['dl'])) {

global $file_dir;

$fileName = $_GET['dl'];

if(isset($_SESSION[$fileName])==true){

$file_name = mb_str($fileName);//转换编码

$file = $file_dir . $file_name;//文件所在路径

if (file_exists($file)) {//判断文件是否存在

$fp = fopen($file, "r");//以只读的方式打开文件

$file_size = filesize($file);//获取文件大小

//发送下载需要的https头文件

header("Content-type: application/octet-stream");

header("Accept-Ranges: bytes");

header("Accept-Length: " . $file_size);//显示文件大小

header("Content-Disposition: attachment; filename=" . $file_name);//告知用户文件名称

echo fread($fp, $file_size);//读取输出文件

fclose($fp);//关闭文件

unset($_SESSION[$fileName]);//最后删除session

exit();//结束

}else{

echo json_encode(array(

'error'=>1,

'meta'=>'文件不存在,无法下载'

));

}

}else{

//当别人不是从本页面下载的时候

echo json_encode(array(

'error'=>1

));

}

}

//首先在本页面提交下载,设置session

if(isset($_GET['file'])){

global $file_dir;

$fileName = $_GET['file'];

$file_name = mb_str($fileName);//转换编码

$file = $file_dir . $file_name;//文件所在路径

if (file_exists($file)) {//判断文件是否存在

$_SESSION[$fileName] = true;

echo json_encode(array(

'error'=>0

));

}else{

echo json_encode(array(

'error'=>1,

'meta'=>"文件不存在,无法下载"

));

}

}

//由于文件名称如果是中文会乱码,随意将gbk转换为utf-8编码

function mb_str($string){

return mb_convert_encoding($string,"GBK","UTF-8");

}

?>

Demo下载地址:【七空幻音】使用PHP让用户在指定页面下载文件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值