Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Download phpBB2 by Przemo na zewnętrznym serwerze FTP
Forum PHP.pl > Forum > Przedszkole
Gilu
Mam problem, ponieważ kolega zapytał sie mnie czy nie da się zrobić downloadu phpBB2 by Przemo tak żeby czytało pliki z zewnętrznego serwera FTP, ponieważ ma już tam mase plików po kilkaset MB i nie chce mu się ich dodawać ręcznie do forum.

Napisałem na początku mały skrypcik pobierający liste plików z serwera za pomoca funkcji ftp_rawlist, ładnie sformatowałem z użyciem formularzy, itp, itd, ale...

...kolega zażyczył sobie żeby użytkownicy nie widzieli loginu i hasła do serwera FTP (chociaż i tak ten użytkownik mógł tylko pobierać pliki) które aktualnie bylo w żródle strony w HTML w postaci:
  1. <a href="ftp://user:pass@serwer.pl/folder/plik.txt">Plik.txt</a>


to wymyśliłem, że php będzie otwierać plik i wyświetlać poprzez funkcje echo/print treść pliku do przeglądarki. Niestety jednak plik pobierał się albo za duży 3 razy, albo tylko połowe, albo kilka MB/KB - różnie ponieważ kombinowałem z warunkiem w while oraz funkcją fread/readfile.

I teraz moje pytanie brzmi co teraz zrobić żeby działo jak trzeba?

Kod odpowiedzialny za pobierani pliku to:
  1. <?php
  2. $file_ext = strtolower(ltrim(strrchr($file, '.' ), '.'));
  3.  
  4. switch($file_ext)
  5. {
  6. [ ...tutaj długa lista rozszerzeń... ]
  7. }
  8.  
  9. $size = 0;
  10.  
  11. $result = @ftp_chdir($conn_id, $folder);
  12. if(!$result)
  13. {
  14. $message = 'Nie mozna przejść do katalogu <b>' . $folder . '</b> na serwerze <b>' . $serwer . '</b>.';
  15. message_die(GENERAL_ERROR, $message);
  16. }
  17. else
  18. {
  19. $zawartosc = get_files($conn_id, '.');
  20.  
  21. //
  22. // Lista plików
  23. //
  24. if(is_array($zawartosc[2]))
  25. {
  26. foreach($zawartosc[2] as $key => $val)
  27. {
  28. if($val['name'] == $file)
  29. {
  30. $size = $val['size'];
  31. }
  32. }
  33. }
  34. }
  35.  
  36. // Przesyłamy typ pliku do przeglądarki
  37. header("Cache-Control:");
  38. header("Cache-Control: public");
  39. header("Content-Type: " . $mime);
  40. if (strstr($_SERVER['HTTP_USER_AGENT'], "MSIE"))
  41. {
  42. # workaround for IE filename bug with multiple periods / multiple dots in filename
  43. # that adds square brackets to filename - eg. setup.abc.exe becomes setup[1].abc.exe
  44. $iefile = preg_replace('/./', '%2e', $filename, substr_count($filename, '.') - 1);
  45. header("Content-Disposition: attachment; filename=\"$iefile\"");
  46. }
  47. else
  48. {
  49. header("Content-Disposition: attachment; filename=\"$file\"");
  50. }
  51. header("Accept-Ranges: bytes");
  52.  
  53. //check if http_range is sent by browser (or download manager)
  54. if(isset($_SERVER['HTTP_RANGE']))
  55. {
  56. list($a, $range)=explode("=",$_SERVER['HTTP_RANGE']);
  57. //if yes, download missing part
  58. str_replace($range, "-", $range);
  59. $size2=$size-1;
  60. $new_length=$size2-$range;
  61. header("HTTP/1.1 206 Partial Content");
  62. header("Content-Length: $new_length");
  63. header("Content-Range: bytes $range$size2/$size");
  64. }
  65. else
  66. {
  67. $size2=$size-1;
  68. header("Content-Range: bytes 0-$size2/$size");
  69. header("Content-Length: ".$size);
  70. }
  71.  
  72. // Odczytujemy treśc pliku
  73. $nazwa_pliku = 'ftp://' . $user . ':' . $pass . '@' . $serwer . '/' . $folder . '/' . $file;
  74. $uchwyt = fopen($nazwa_pliku, 'rb');
  75. //seek to start of missing part
  76. fseek($uchwyt, $range);
  77. flock($uchwyt, LOCK_SH);
  78. while(!feof($uchwyt))
  79. {
  80. print(fread($uchwyt, 8192));
  81. flush();
  82. }
  83. flock($uchwyt, LOCK_UN);
  84. fclose($uchwyt);
  85. ?>


część kodu pochodzi z komentarzy do funkcjii fread z manuala php - http://pl.php.net/manual/pl/function.fread.php
anonim1133
nie zglebialem dokladnie kodu ;p


  1. <?php
  2. header("Content-Range: bytes $range$size2/$size");
  3. ?>

nie powinno byc tak?:
  1. <?php
  2. $naglowek = 'Content-Range: bytes '.$range.' '.$size2/$size;
  3. header($naglowek);
  4. ?>
Gilu
Niestety nic nie pomogło, zero różnicy nadal plik 164MB ucięło przy 48 bodajze
Gilu
Jeżeli naprawdę nikt nie wie jak spowodować dobre i całkowite pobieranie plików, to może ktoś wie jak w inny sposób 'zamaskować' źródło ścieżki z danymi do ftp ?
dadexix
a nie masz możliwości utworzenia public_ftp/konta anonymouse?
Gilu
Szczerze mówiąc nie wiem. To jest osobny dokupiony dysk, ale spytam hostingoodawcy. Nie byłoby jednak możliwości poprawienia istaniejącego kodu ?
dadexix
ale po co?
Marnujesz transwer i zasoby servera....

a tak to jak masz public_ftp/konto anonymouse to ludzie mogą ściągać bez logowania się do ftp... to co ma być "dostępne" dajesz do katalogu jednego, robisz anony dla tego katalogu i masz:)
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.