如何防止文件位置显示?

时间:2011-07-21 14:59:21

标签: php filesystems location storage

我允许用户将文档上传到服务器。但是,我不希望他们明显看到文件的存储位置。我能做什么才能让他们仍然获取文件但却看不到文件位置。

3 个答案:

答案 0 :(得分:3)

您可以使用PHP查询来完成此操作,假设您使用以下URL:

http://mysite.com/files.php?file=xyz.pdf

在files.php中,您可以检查获取变量文件并使用硬编码函数来检索文件。您可以通过使用标头强制下载或将文件读入var并将其内容打印到页面来实现这一目的。比如像读取文件并将其打印到页面的pdf与将其链接到文件相同。

但是

警告:与使用标题一样,除了文件之外,不会向页面打印任何内容。如果您阅读文件并打印它,我还建议您仍然声明标题,以便最终用户不会获得作为文件来源的gobbly goop,即jpg或pdf。

哦不,我忘了标题警告,自从Adobe为PDF的开源制作ISO以来,我一直遇到标题问题,具体取决于生成PDF的应用程序和用户上传PDF的浏览器来自,标题将来自:

'application/pdf', 'application/x-download','application/octet-stream','application/octet','binary/octet-stream'

所以要小心将上传部分硬编码为标题类型,我知道这个问题是关于下载但我只是想我会把它扔在那里。使用标题进行下载并不重要,我只需使用标准的application / pdf。

答案 1 :(得分:2)

有一些方法可以解决这个问题,但我更喜欢使用.htaccess

所以我的链接看起来像http://example.com/files/filename.zip url中的额外参数可以使用用户名或密码,如:

 http://example.com/files/bob/filename.zip

 http://example.com/files/18d52c/filename.zip

然后可以针对数据库检查thos以查看是否允许用户下载该特定文件,就像您在付款后用于即时下载一样..但基本方法是这样的:

<强>的.htaccess

RewriteRule ^files/(.*)$ serve.php?file=$1

<强> serve.php

<?php 
 if(isset($_GET['file'])){
    $file=basename($_GET['file']);
    //Protect the index.php && serve.php
    if(basename($_GET['file'])=='index.php' || basename($_GET['file'])=='serve.php'){
        header("HTTP/1.1 403 Forbidden");die();
    }
    $downloadFolder="original_location/";
    if(file_exists($downloadFolder.$file)){

        $fsize = filesize($downloadFolder.$file);
        $ctype=finfo_file(finfo_open(FILEINFO_MIME_TYPE), $downloadFolder.$file);

        if(ini_get('zlib.output_compression'))
        ini_set('zlib.output_compression', 'Off');

        header("Pragma: public");
        header("Expires: 0");
        header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
        header("Cache-Control: private",false);
        if(strstr($_SERVER["HTTP_USER_AGENT"],"MSIE")==false) {
            header("Content-Type: application/force-download");
            header('Content-Description: File Transfer');
        }else{
            header("Content-Type: $ctype");
        }
        header("Content-Disposition: attachment; filename=\"".basename($file)."\";" );
        header("Content-Transfer-Encoding: binary");
        header("Content-Length: ".$fsize);

        ob_clean();
        flush();
        readfile('original_location/'.$file);
    }else{
        header("HTTP/1.0 404 Not Found");
    }
    die();
 }
 header("HTTP/1.0 404 Not Found");
?>

<强> original_location / index.php的

header("HTTP/1.1 403 Forbidden");

答案 2 :(得分:1)

使用您可以映射到真实文件的随机唯一ID来存储它,然后使用在实际文件上执行readfile()的脚本来提供它。

http://php.net/readfile文档也有一个关于如何强制下载的示例。