前端怎样实现下载文件,而不暴露文件路径(不被抓包工具抓到)或者即使被抓到再次通过路径直接访问也拿不到文件

前端怎样实现下载文件,而不暴露文件路径(不被抓包工具抓到)或者即使被抓到再次通过路径直接访问也拿不到文件

阅读 8.1k
9 个回答

题主采纳的答案是用PHP完成传输,这么做小文件还行,大文件,那就坑爹了。

PHP本职工作不是干文件传输,不建议这样搞。

正确的做法,以 Nginx + PHP 为例应该是:

1、指定一个加密链接规则,如 /download/xiaoming.zip?time=1520907835&sign=md5(download=xiaoming.zip&time=1520907835&key=私有密钥)
2、PHP 完成用户鉴权,并按加密链接规则返回加密链接
3、Nginx 负责处理下载目录的请求

     先检查链接参数,参数格式不对,拒绝访问
     然后检查链接签名,签名错了,拒绝访问
     然后计算 time 距离现在多久,超过特定时间(如30分钟),拒绝访问
     最后,符合要求的,输出文件

不可能。

.

使用一次性的下载链接,抓包工具抓到到也没用。

1.用action 向流里写字节流

  1. 用时间hash 后做key

3.收到key 后验key 给文件

每次下载请求前先获取一个后台随机生成的一次性加密值,下载请求带上加密值,验证成功才能下载

给图片配上路由信息。

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);
        }
?>
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题