前端怎样实现下载文件,而不暴露文件路径(不被抓包工具抓到)或者即使被抓到再次通过路径直接访问也拿不到文件
前端怎样实现下载文件,而不暴露文件路径(不被抓包工具抓到)或者即使被抓到再次通过路径直接访问也拿不到文件
java后端使用
OutputStream os = response.getOutputStream();
int length;
os.write(bytes, 0, bytes.length);
这个输出流到前端,这样前端只能下载文件,而得不到文件路径
下载 是后端返回文件数据的操作 所以判别是否返回数据的工作应在后台完成
原则上后台不会信任前端传来的任何标志信息 都要进行校验 所以你前端只管提供链接就可以 链接打开后 是否返回数据由后端来决定
后来通过的是使用后台验证的方法,前端在网站上点击的时候向后台传递用户的id,后台设置对应id的一个token值,并将文件下载到服务器,然后前端再访问此php,后台根据是否有token值决定向前台是否传输文件,传输过后则删除此token,下次再直接访问此php则因为无token而不提供传输文件
<?php
header('Access-Control-Allow-Origin:*');
$action = $_REQUEST["action"];
$uid = $_REQUEST['uid'];
if($action == "setToken"){
$time = time();
$json_string = file_get_contents('data.json');
$data = json_decode($json_string, true);
$data[$uid] = $time;
$json_string = json_encode($data);
file_put_contents('data.json', $json_string);
echo "success";
}else if($action == "getToken"){
$json_string = file_get_contents('data.json');
$data = json_decode($json_string, true);
echo $data[$uid];
}else if($action == "compare"){
$time = time();
$json_string = file_get_contents('data.json');
$data = json_decode($json_string, true);
$dec = (int)$time - (int)$data[$uid];
if($dec < 1){
download();
echo "下载成功";
}else{
echo "失效";
}
}
function download(){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://img.kuaxue.com/G_compress/".$_REQUEST['fileUrl']);
curl_setopt($ch, CURLOPT_REFERER, "");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
$cexecute = curl_exec($ch);
curl_close($ch);
file_put_contents(basename($_REQUEST['fileUrl']),$cexecute);
$file_url=basename($_REQUEST['fileUrl']);
$new_name= $_REQUEST['new_name'];
if(!isset($file_url)||trim($file_url)==''){
echo '500';
}
if(!file_exists($file_url)){ //检查文件是否存在
echo '404';
}
$file_name=basename($file_url);
$file_type=explode('.',$file_url);
$file_type=$file_type[count($file_type)-1];
$file_name=trim($new_name=='')?$file_name:($new_name);
$file_type=fopen($file_url,'r'); //打开文件
//输入文件标签
header("Content-type: application/octet-stream");
header("Accept-Ranges: bytes");
header("Accept-Length: ".filesize($file_url));
header("Content-Disposition: attachment; filename=".$file_name);
//输出文件内容
echo fread($file_type,filesize($file_url));
fclose($file_type);
unlink($file_url);
}
?>
10 回答11.3k 阅读
5 回答4.9k 阅读✓ 已解决
4 回答3.2k 阅读✓ 已解决
2 回答2.8k 阅读✓ 已解决
3 回答5.2k 阅读✓ 已解决
1 回答3.4k 阅读✓ 已解决
3 回答2.4k 阅读✓ 已解决
题主采纳的答案是用PHP完成传输,这么做小文件还行,大文件,那就坑爹了。
PHP本职工作不是干文件传输,不建议这样搞。
正确的做法,以 Nginx + PHP 为例应该是:
1、指定一个加密链接规则,如
/download/xiaoming.zip?time=1520907835&sign=md5(download=xiaoming.zip&time=1520907835&key=私有密钥)
2、PHP 完成用户鉴权,并按加密链接规则返回加密链接
3、Nginx 负责处理下载目录的请求