Как предотвратить отображение местоположения файла? - PullRequest
0 голосов
/ 21 июля 2011

Я разрешаю пользователям загружать документы на сервер. Тем не менее, я не хочу, чтобы они явно видели, где хранятся файлы. Что я могу сделать, это позволит им по-прежнему получить файл, но не видя местоположение файла.

Ответы [ 3 ]

3 голосов
/ 21 июля 2011

Вы можете использовать PHP-запрос для этого, допустим, вы используете следующий URL:

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

В файле files.php вы можете проверить файл переменной get и получить жестко запрограммированную функцию, которая извлекаетфайл.Вы можете сделать это многими способами, используя заголовки для принудительной загрузки или чтения файла в var и распечатки его содержимого на странице.Например, как PDF чтение файла и его печать на странице - это то же самое, что связывание его с файлом.

предупреждение: как и при использовании заголовков, не печатайте ничего на странице, кроме файла.Я также рекомендую объявлять заголовки по-прежнему, если вы читаете файл и распечатываете его, чтобы конечный пользователь не получил скупую петлю, которая является источником файла, то есть jpg или pdf.

О, нет, я забыл предупреждение о заголовке, у меня возникла проблема с заголовком с тех пор, как Adobe создала ISO для открытого исходного кода PDF, в зависимости от приложения, создавшего PDF, и браузера, из которого пользовательпри загрузке PDF из заголовка будет что-нибудь из:

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

, поэтому будьте внимательны при кодировании раздела загрузки с типом заголовка, я знаю, что этот вопрос касается загрузок, но я просто подумал, что добавлю это втам.Также использование заголовков для загрузки не имеет значения, я бы просто использовал стандартное приложение / pdf там.

2 голосов
/ 21 июля 2011

Есть несколько способов сделать это, но я предпочитаю использовать .htaccess

Так что моя ссылка будет выглядеть как http://example.com/files/filename.zip Дополнительные параметры в URL могут быть использованы имя пользователя или пароль, такие как:

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

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

Затем это можно проверить в базе данных, чтобы узнать, разрешено ли пользователю загружать этот конкретный файл, так же, как вы использовали бы для мгновенных загрузок после оплаты ... но основной метод будет выглядеть так:

.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");
1 голос
/ 21 июля 2011

Сохраните его, используя некоторый случайный уникальный идентификатор, который вы можете сопоставить с реальным файлом, а затем обслужите его, используя скрипт, который выполняет readfile() для фактического файла.

* * В 1007 * документах также есть пример того, как заставить его загружаться.

...