Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Autoryzacja na download pliku
Forum PHP.pl > Forum > PHP
WMP
Witam. Mam taki problem. Chciałbym żeby np plik archiwum.zip mógł być pobrany tylko raz przez jedną, osobę. Żeby po pobraniu tego pliku, zmieniła się nazwa katalogu w którym jest, np. z 1234567 na 1342567. Chodzi mi o to, żeby nikt nie mógł podać na jakimś forum linku do pliku. Chce, zrobić coś podobnego jak jest na rapidshare.com.

Załóżmy, podaję pewnej osobie plik do pliku archiwum.zip, np. 1234567/archiwym.zip. Osoba wchodzi, i pobiera. Aby ta osoba nie mogła podać komuś poprawnego linku, skrypt zminia nazwę katalogu, np. na 13243546. Lecz, chciałbym też, aby ta osoba która pobiera, mogła dalej pobierać, gdyby się rozłączyła przed skończeniem pbierania, zeby bez kłopotu mogła dokończyć pobieranie. Czy ktoś wie, jak to można zrobic? Mam dostęp do shella, więc z komendami linuksowymi i skryptami nie będzie problemu.
tsharek
a po co chcesz zmieniać katalog? wystarczy że autoryzację zrobisz w tym samym pliku którym wysyłasz plik. Więcej o tym znajdziesz m.in. w tym wątku. Tam masz opis do obrazków, ale tutaj będziesz mieć prościej, bo zawsze content-type będzie force-download.
WMP
Hmmm. Czyli robię tak:
1. tworzę jakiś katalog download/ w którym będzie index.php
2. Pliki trzymam w pliki123456hrhrt/
3. Jeżeli chcę, poda komuś link to daję www.adres/download/index.php?nazwa_pliku.zip
4. Co tu się dzieje? Czy wyświetla się strona, prosząca o hasło? Jeżeli hasło będzie poprawne, to co wtedy?
tsharek
Tak, wtedy strona się wyświetla o podanie hasła -> jak autoryzacja jest OK to wtedy ustawiana jest jakaś sesja -> jeżeli jest ustawiona sesja to dalszej części pliku robisz mechanizm wysyłający plik, np korzystając ot z takiej funkcji:
  1. <?php
  2. function download_file($file)
  3. {
  4.  
  5. $rozmiar = filesize($file);
  6. $filename=basename($file);
  7. if(isset($_SERVER['HTTP_RANGE']) && preg_match('/bytes=([0-9]+)-([0-9]*)/', $_SERVER['HTTP_RANGE'], $bytes))
  8. {
  9. $start=(float)$bytes[1];
  10. $stop=(float)$bytes[2];
  11. if($stop<$start || $stop>=$rozmiar) $stop=$rozmiar-1;
  12. $dlg=$stop-$start+1;
  13. }
  14.  
  15. if(!isset($dlg))
  16. {
  17. header('HTTP/1.1 200 OK');
  18. header('Accept-Ranges: bytes');
  19. header('Content-Length: '.$rozmiar);
  20. }
  21. else
  22. {
  23. header('HTTP/1.1 206 Partial Content');
  24. header('Accept-Ranges: bytes');
  25. header('Content-Length: '.$dlg);
  26. header('Content-Range: bytes '.$start.'-'.$stop.'/'.$rozmiar);
  27. }
  28. header('Content-Type: application/force-download');
  29. if(strstr($_SERVER['HTTP_USER_AGENT'], 'MSIE')) header('Content-Disposition: attachment; filename="'.preg_replace('/./', '%2e', $filename, substr_count($filename, '.')-1).'"');
  30. else header('Content-Disposition: attachment; filename="'.$filename.'"');
  31. header('Content-Transfer-Encoding: binary');
  32.  
  33. $fp=fopen($file, 'rb');
  34. if(isset($start)) fseek($fp, $start);
  35.  
  36. while(!feof($fp))
  37. {
  38. print(fread($fp,1024*8));
  39. flush();
  40. }
  41. fclose($fp);
  42. }
  43. ?>
WMP
aha, myślę, że sobie poradzę, dzięki

Tylko jedna sprawa, nie wyobrażam sobie kod z sesjami...
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.