2012-09-25 20 views
8

Robię projekt dla tymczasowego link do pobrania dla mnie chronić plik z Hotlinkers ...Jak zrobić tymczasowy odnośnik do pobrania pliku

wierzę, że jest to możliwe, aby to zrobić .. dlatego, że wszyscy wiedzą, że wiele stron poświęconych udostępnianiu plików "nie chce wspominać o żadnym" ... ich link do pliku wygaśnie ...

Ex.

Czy po pobraniu jednego pliku z jego witryny podany jest bezpośredni link do kliknięcia w prawo? , ale ten link wygaśnie zaraz po kilku godzinach lub minutach.

Skąd mam wiedzieć, że link wygasł? Jeśli skopiuję ten sam link do mojego menedżera pobierania po jednym dniu, nie będzie on mógł pobrać tego samego pliku.

Już to umożliwiłem w htaccess.

Przykł.

RewriteRule .*\.(rar|ZIP)$ http://domain.com [R,NC] 

gdyby skopiować bezpośredni link w pasku adresu przeglądarki będą przekierowywane http://domain.com

Ale jeśli skopiować bezpośredni link na trenera pobrać plik zostanie pobrany.

Co zrobić, jeśli zamieści link do innej witryny, takiej jak strona forum, blog itp., i poprosić czytelnika, aby skopiował i wkleił link do swojego menedżera pobierania, aby mogli go pobrać bezpośrednio.

Jest to problem, który chcę zapobiec, aby chronić mój plik. Robię to w PHP, ale nie mogę tego rozgryźć ...

Twoja pomoc jest bardzo cenna.

Odpowiedz

1

użyć niektórych kod jak ten

$path="uploads/"; 
        $actualfilename=$path.$filename; 
        $fakefilename="downloadfile.pdf"; 
        if($typeofview=="download") { 
          @readfile($actualfilename); 
         header('Content-type: application/pdf'); 
         header('Content-Disposition: attachment; filename="' . $fakefilename . '"'); 
         header('Content-Transfer-Encoding: binary'); 
         header('Content-Length: ' . filesize($actualfilename)); 
         header('Accept-Ranges: bytes'); 
         exit; 

dodać to do Twojego.htaccess

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule fakefile.php(.*)$ orignalfile.php?$1 [L,QSA] 
+0

Postara to jedno wielkie dzięki. – Vhanjan

+0

Nie powinieneś używać do tego celu .htaccess, ponieważ stanie się on nieosiągalny, ponieważ masz więcej plików i różnych lokalizacji. – dogmatic69

0

Rozwiązanie, które przychodzi mi na myśl jest następująca: Jeśli masz tabelę, która reprezentuje plik, a na przykład FileModel można zapisać w niej nazwy pliku, dane, wielkość także ścieżkę do plik w systemie plików i niepowtarzalne, które mogą być wynikiem MD5 z niektórych danych wybrać dla niej na podstawie pewnych szczegółów plików na przykład:

$data[FileModel]['unique'] = md5(time() . $data[FileModel]['file']); 

Każdorazowo przed pozwalając ktoś pobrać plik sprawdzić, czy istnieje taka unikalna wartość w twojej tabeli, jeśli pozwolisz komuś pobrać ją za pomocą metody downloadFile stworzonej w FileModel, ale tuż przed zrobienie nowy unikalny aby uniknąć jakichkolwiek liczbę pobrań

$data[FileModel]['unique'] = md5(time() . $data[$this -> name]['file']); 
$this -> FileModel-> save($data[$this -> name]); 
$this -> FileModel -> downloadFile($data[$this -> name]); 

Jeśli nie ma takiego wyjątkowa wartość w ur bazy to po prostu pokazać się błąd o timeouted linku do użytkownika

$this -> setFlashError('link expired'); 

tu PASE dla was przykładowy prototyp działania, które można zacząć w kontrolerze:

function download($file_data = ''){ 
     $data = $this->FileModel->find('first', array('conditions' => array('FileModel.unique' => $file), 'fields' => array('*'))); 

     if(!is_array($data[FileModel])) $this -> setFlashError('link expired'); 

     else 
     { 
      $data[FileModel]['unique'] = md5(time() . $data[$this -> name]['file']); 
      $this -> FileModel-> save($data[$this -> name]); 
      if(!$this -> FileModel -> downloadFile($data[$this -> name])) 
      { 
       $this -> setFlashError('error')); 
      } 
     } 
} 

Ponadto można tworzyć datetime pole, w którym można na przykład dodać 1 dnia do aktualnego DAT e i sprawdź, czy czas pozostały do ​​pobrania wygasł.

21

Link do czegoś takiego jak /downloads/abb76b3acbd954a05bea357144d614b4, gdzie abb ... to losowy ciąg znaków, taki jak solony skrót z bieżącego czasu. Kiedy tworzysz link dla kogoś, przechowuj losowy ciąg w tabeli bazy danych. Tabela ta może wyglądać następująco:

+----+-------------+----------------------------------+---------------------+---------------------+ 
| id | filename | token       | created    | modified   | 
+----+-------------+----------------------------------+---------------------+---------------------+ 
| 1 | image.jpg | abb76b3acbd954a05bea357144d614b4 | 2012-03-26 19:36:41 | 2012-03-26 19:36:41 | 
| 2 | program.exe | 19660d0f5e0ca3d42e1718de5d0a1d7e | 2012-08-29 11:07:58 | 2012-08-29 11:07:58 | 
+----+-------------+----------------------------------+---------------------+---------------------+ 

Gdy pojawi się żądanie w /downloads/..., spojrzeć na losowy ciąg i odesłać odpowiedni plik. Jeśli znacznik czasu created jest za stary, nie rób tego. Użyj cronjob, aby wyczyścić stare wiersze tabeli, lub mniej idealnie, zrobić to za każdym razem, gdy ktoś zgłasza żądanie do /downloads/....

+0

Myślę, że jest to łatwe i czyste, ale nadal istnieją szanse, że ktoś pobierze plik. –

0

jeden znalazłem:

header('Content-Type: application/force-download'); 
$filee = "your_file.txt"; 
$filesLocation = dirname(__file__).'/the_sub_folder_for_the_file/'.$filee; 
header('Content-Length:' . filesize($filesLocation)); 
header("Content-Disposition: inline; filename=\"".$filee."\""); 
$filesPointer = fopen($filesLocation,"rb"); 
fpassthru($filesPointer); 
0

wiem, że to stare pytanie, ale mam sposób, aby pobrać plik tylko 1 raz bez użycia bazy danych, szybki sposób :)

if(isset($_GET['file']) && file_exists($_GET['file'])) 
{ 
    $oldName = $_GET['file']; 
    $newName = md5(time()).".txt"; 

    if(rename($oldName, $newName)) { // rename file to download just once 
     downloadFile($newName); // download file function 
    } else { 
     echo 'this file is not exist'; 
    } 
}