2017-06-02 110 views
0

我有一个小问题,我的PHP应用程序,我有一个名为“my_files”里面这个文件夹我有很多目录下的许多pdf。 内部“my_files”目录,我把这个htaccess的行拒绝直接访问形式的URL(工作正常):拒绝直接访问pdf文件,但允许当用户登录

Order Deny,Allow 
Deny from all 

在我的根目录的项目,我把这个PHP文件(get_file.php)只允许PDF下载记录-in成员:

if(!empty($_GET['pdf_name'])) { 
    // check if user is logged  
if(is_user_logged_in()){ 
    $pdf_name = preg_replace('#[^-\w]#', '', $_GET['pdf_name']); 
    $pdf_folder = {$_SERVER['DOCUMENT_ROOT']}/docs/en; 
    $fic = "{$pdf_folder}/{$pdf_name}.pdf"; 
    if(file_exists($fic)){ 
     header('Cache-Control: public'); 
     header('Content-Description: File Transfer');*/ 
     header('Content-Type: application/pdf'); 
     header("Content-Disposition: attachment; filename={$fic}"); 
     header('Content-Transfer-Encoding: binary'); 
     readfile($fic); 
     exit; 
    } 
    } 
} else { 
    die("ERROR: you don't have permissions to download it."); 
} 

当我访问此网址:

myappdomaindotcom/get_file.php?pdf_name=STUDENTS 

浏览器返回:

This web page is not available 
ERR_INVALID_RESPONSE 

有人可以帮我吗?目的是禁止文件直接访问,但只允许登录成员。

UPDATE

在浏览器控制台我得到这样的响应: 为什么我的数据:图像????

browser console

UPDATE V2

我改了一下代码以添加引用,但我得到了同样的结果,该文件确实存在,但控制台返回相同的故障状态。

if(!empty($_GET['pdf_name'])) { 
    // check if user is logged  
    if(is_user_logged_in()) { 


    $pdf_name = preg_replace('#[^-\w]#', '', $_GET['pdf_name']); 
    $pdf_folder = "{$_SERVER['DOCUMENT_ROOT']}/docs/en"; 
    $pdf_file = "{$pdf_folder}/{$pdf_name}.pdf"; 
    echo $pdf_file; 
    if(file_exists($pdf_file)) 
    { 

     header('Cache-Control: public'); 
     header('Content-Description: File Transfer'); 
     header('Content-Type: application/pdf'); 
     header("Content-Disposition: attachment; filename={$pdf_file}"); 
     header('Content-Transfer-Encoding: binary'); 
     readfile($pdf_file); 

    } 
    } 
} else { 
    die("ERROR: you don't have permissions to download it."); 
} 

UPDATE V3工作

我终于解决了它从这个帖子:solution,下面是最终代码:

if(!empty($_GET['pdf_name'])) { 

// check if user is logged  
if(is_user_logged_in()) { 

    $proxiedDirectory = "{$_SERVER['DOCUMENT_ROOT']}/xxxx/"; 
    $filename   = $_GET['pdf_name']; 
    $file    = $proxiedDirectory.$filename.'.pdf'; 
    $basename   = basename($file); 

    if(file_exists($file)){ 
     $fp = fopen($file, 'rb'); 

     header("Content-Type: application/pdf", true, 200); //May need to determine mime type somehow 
     header("Content-Disposition: attachment; filename={$basename}"); 
     header('Cache-Control: public'); 
     readfile($file); 
     exit(); 
    } 

} 

} else { die("ERROR: you don't have permissions to download it.");} 

谢谢你的帮助球员,但我有一个最后的问题:是否可以打开PDF而不是下载它?

+0

那么,你应该检查你的浏览器收到的实际响应。打开浏览器开发控制台,选择“网络”选项卡并检查请求。 – arkascha

+0

你好,谢谢你,我更新了我的问题,我收到失败的答复。 – user44321

+1

而不是拒绝所有,尝试添加以允许服务器IP。或者把这些文件放在webroot之外并使用绝对路径来访问他们 – RST

回答

0

尝试此代码

误差线这个$ pdf_folder = {$ _SERVER [ 'DOCUMENT_ROOT']} /文档/ EN;不是字符串。

if(!empty($_GET['pdf_name'])) { 
    // check if user is logged  
if(is_user_logged_in()){ 
    $pdf_name = preg_replace('#[^-\w]#', '', $_GET['pdf_name']); 
    $pdf_folder = "{$_SERVER['DOCUMENT_ROOT']}/docs/en"; 
    $fic = "{$pdf_folder}/{$pdf_name}.pdf"; 
    if(file_exists($fic)){ 
     header('Cache-Control: public'); 
     header('Content-Description: File Transfer');*/ 
     header('Content-Type: application/pdf'); 
     header("Content-Disposition: attachment; filename={$fic}"); 
     header('Content-Transfer-Encoding: binary'); 
     readfile($fic); 
     exit; 
    } 
    } 
} else { 
    die("ERROR: you don't have permissions to download it."); 
} 
+0

它可能有助于解释你改变了什么,以及为什么 – RST

+0

@RST PHP字符串总是单引号或双引号是真的。 –

+0

我知道。没有解释你的答案就不完整。 – RST

相关问题