Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wysyłanie pliku na żądanie skryptem
Forum PHP.pl > Forum > PHP
Black-Berry
Witam, mam skrypt do wysyłania plików z serwera do użytkownika. Niestety okazało się że mozliwe jest wysyłanie tylko 1 pliku na raz. Nie mam pojęcia dlaczego. Co ciekawe mam w switchu 2 komputery i na obu mozna sciągać ten sam plik jednocześnie. Nie można tylko ściągać (nawet 2 różnych plików) jednocześnie na jednej maszynie. Czy ktoś mógłby coś doradzić ?

  1. <?php
  2. class Sender
  3. {
  4. /***
  5.   * This function takes a path to a file to output ($file), the filename that
  6.   * the browser will see ($name) and the MIME type of the file ($mimeType, optional).
  7.   *
  8.   * If you want to do something on download abort/finish,
  9.   * register_shutdown_function('function_name');
  10.   */
  11. public static function OutputFile($file, $name='', $mimeType='')
  12. {
  13. if (!is_readable($file)) die('File not found or inaccessible!');
  14.  
  15. $size = filesize($file);
  16. if (!$name) $name = basename($file);
  17. $name = rawurldecode($name);
  18.  
  19. // Figure out the MIME type (if not specified)...
  20. $known_mime_types = array(
  21. "pdf" => "application/pdf",
  22. "txt" => "text/plain",
  23. "html" => "text/html",
  24. "htm" => "text/html",
  25. "exe" => "application/octet-stream",
  26. "zip" => "application/zip",
  27. "doc" => "application/msword",
  28. "xls" => "application/vnd.ms-excel",
  29. "ppt" => "application/vnd.ms-powerpoint",
  30. "gif" => "image/gif",
  31. "png" => "image/png",
  32. "jpeg" => "image/jpg",
  33. "jpg" => "image/jpg",
  34. "php" => "text/plain"
  35. );
  36.  
  37. if ($mimeType == '') {
  38. $file_extension = strtolower(substr(strrchr($file, "."), 1));
  39. if (array_key_exists($file_extension, $known_mime_types)) {
  40. $mimeType = $known_mime_types[$file_extension];
  41. } else {
  42. $mimeType = "application/force-download";
  43. };
  44. };
  45.  
  46. @ob_end_clean(); //turn off output buffering to decrease cpu usage...
  47.  
  48. // required for IE, otherwise Content-Disposition may be ignored...
  49. if (ini_get('zlib.output_compression')) ini_set('zlib.output_compression', 'Off');
  50.  
  51. header('Content-Type: ' . $mimeType);
  52. header('Content-Disposition: attachment; filename="'.$name.'"');
  53. header("Content-Transfer-Encoding: binary");
  54. header('Accept-Ranges: bytes');
  55.  
  56. // The three lines below basically make the download non-cacheable...
  57. //header("Cache-control: private");
  58. //header('Pragma: private');
  59. //header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
  60.  
  61. // multipart-download and download resuming support
  62. if (isset($_SERVER['HTTP_RANGE'])) {
  63. list($a, $range) = explode("=", $_SERVER['HTTP_RANGE'], 2);
  64. list($range) = explode(",", $range, 2);
  65. list($range, $range_end) = explode("-", $range);
  66. $range = intval($range);
  67. if (!$range_end) {
  68. $range_end=$size-1;
  69. } else {
  70. $range_end=intval($range_end);
  71. }
  72. $new_length = $range_end-$range+1;
  73. header("HTTP/1.1 206 Partial Content");
  74. header("Content-Length: $new_length");
  75. header("Content-Range: bytes $range-$range_end/$size");
  76. } else {
  77. $new_length = $size;
  78. header("Content-Length: " . $size);
  79. }
  80.  
  81. /* output the file itself */
  82. $chunksize = 1 * (1024 * 1024); //you may want to change this
  83. $bytes_send = 0;
  84. if ($file = fopen($file, 'r')) {
  85. if (isset($_SERVER['HTTP_RANGE'])) fseek($file, $range);
  86. while(!feof($file) && (!connection_aborted()) && ($bytes_send<$new_length)) {
  87. $buffer = fread($file, $chunksize);
  88. echo ($buffer);
  89. flush();
  90. $bytes_send += strlen($buffer);
  91. }
  92. fclose($file);
  93. } else {
  94. die('Error - can not open file.');
  95. }
  96. //end PHP script...
  97. die();
  98. }
  99. }
  100. ?>


przykładowe linki
http://62.75.147.61/bar_application/Reques...php?storageId=2
http://62.75.147.61/bar_application/Reques...php?storageId=6
fander
U mnie mogę ściągać 2 pliki na raz z tym że po ściągnięciu zajmują po 0 bajtów, ten kod coś nie działa tongue.gif
Black-Berry
Cytat(fander @ 25.09.2010, 12:00:38 ) *
U mnie mogę ściągać 2 pliki na raz z tym że po ściągnięciu zajmują po 0 bajtów, ten kod coś nie działa tongue.gif


Temu że robiłem testy... musisz mi uwierzyć na słowo; linki przestały wskazywac ten skrypt ale jeśli on wysyła plik do usera to ten user nie może ściągać drugiego. Nie może on również wejść na żadną stronę na tym serwerze. Poprostu blokuje się dostęp do czegokolwiek innego co korzysta z php. Najdziwniejsze że wejścia z innego komputera działają. Wygląda na to że nie rozumiem jak działa PHP sad.gif Myślałem że poszczególne wywołania skryptów są od siebie niezależne. Okazuje się że nie sad.gif Może to wina apacha ?

@EDIT
OK, poprawiłem linki. Okazuje się że przeglądarka jakoś dziwnie to interpetuje. Na tej samej maszynie różne przeglądarki mogą sciągać ten sam plik. Jednak jedna przeglądarka nie może?? Dlaczego?? Coś nei tak z nagłówkami questionmark.gif
fander
Zrób tak aby link do pliku który chcesz ściągnąć wyglądał następująco

Kod
http://62.75.147.61/bar_application/Reques/SendFile/StorageId/<id pliku>


i zobacz czy będzie ściągało poprawnie, może przeglądarka uważa że link.php?cos=cos jest tyma samym co link.php?cos=cos2
kiler129
Ja bym bardziej opiewał na zabezpieczenia serwera bo badź co bądź php wtedy wisi i jeśli zabezpieczenia są restrykcyjne to user nie może otwierać kolejnych phpków zanim tamtego nie skończy otwierać.
Black-Berry
Cytat(kiler129 @ 25.09.2010, 14:50:50 ) *
Ja bym bardziej opiewał na zabezpieczenia serwera bo badź co bądź php wtedy wisi i jeśli zabezpieczenia są restrykcyjne to user nie może otwierać kolejnych phpków zanim tamtego nie skończy otwierać.

Co masz na myśli? Jak takie ustawienia można zmienić lub sprawdzić ? Gdzie mam szukać ?

Cytat(fander @ 25.09.2010, 12:48:00 ) *
Zrób tak aby link do pliku który chcesz ściągnąć wyglądał następująco

Kod
http://62.75.147.61/bar_application/Reques/SendFile/StorageId/<id pliku>


i zobacz czy będzie ściągało poprawnie, może przeglądarka uważa że link.php?cos=cos jest tyma samym co link.php?cos=cos2


Nie bo jeśli sciągam plik to nie odpowiadają też inne subfoldery, nawet index.php ani żaden inny skrypt.
kiler129
Zapewne masz Apache (którego nie znam). Musisz poszukać w google coś o cgi execute limit lub coś podobnego.
Myk polega na tym że cgi potrafi wykonywać tylko 1 żądanie na raz i często stosuje się zabezpieczenie aby jeden user nie mógł zapchać całego serwera.
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.