Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: problem ze sciaganie plików z serwera windows
Forum PHP.pl > Forum > PHP
tomek34
witam!!
problem wygląda następująco: Plik wrzucam na serwer poprzez klienta FTP. Plik wgrywa sie poprawnie i bez problemu ściaga za pomocą FTP. Natomiast na stronie listuje się bez problemu. Otwiera się też bez problemu i pozwala wybrać czy będzie otwarty czy ściągnięty. Niestety ani nie otwiera się ani nie ściaga poprawnie. Tworzy się plik o zero bajtach. Całość obsluguje następujący plik:
  1. <?php
  2.             $dir = "D:sercomfotki";
  3.                  function printDir($dir)
  4.                  {
  5.                   $fd = opendir($dir);
  6.                       if(!$fd) return false;
  7.                                while (($file = readdir($fd)) !== false){
  8.                       $pos = strpos($file, ' ');
  9.                       if($file != "." && $file != ".." && $pos === false){
  10.                       echo("<a href=\"download.php?name=");
  11.                       echo("$file\" class='style3'>$file</a><br />");
  12.                       }
  13.                   }
  14.                   closedir($fd);
  15.               }
  16.               printDir($dir)
  17. ?>

Proszę o pomoc. Nie mam żadnego pomyslu.
Pozdrawiam
erix
Kod
D:\ser\com\fotki

Ekhm, używaj odwrotnych ukośników.

Cytat
Niestety ani nie otwiera się ani nie ściaga poprawnie.

A jakiego serwera używasz?
tomek34
niestety windowsowego IIS

ktos ma jakis pomysl??
erix
Zmieniłeś ścieżki? Po linkach bezpośrednich do plików to samo?
tomek34
ale to windows serwer to jak ukosniki w druga strone??
erix
Normalnie. PHP sobie z nimi poradzi tym bardziej, że w tej chwili zapis wskazuje na encje, i tak: albo escape'ujesz, albo odwróć slesze. PHP sobie poradzi, IIS też.

Zresztą, w eksploratorze możesz stosować dowolne ukośniki, o URL-ach nie wspomnę.
tomek34
po odwroceniu nadal jest to samo.
nie uruchamia pliku i sciaga plik zerowej wartosci o poprawnej nazwie
erix
Zadałem pytanie:
Cytat
Po linkach bezpośrednich do plików to samo?
tomek34
po linku bezpośrednim się uruchamia
erix
Ok, pokaż co w tej chwili wypluwa skrypt, chodzi mi o linki.
tomek34
tzn plik się otwiera ale nie daje mozliwosci zapisania

mozesz jaksniej bo nie rozumiem

skrypt wyswietla zawartosc folderu w formie nazwa i rozszerzenie
erix
Załącz kod wynikowy, czyli wygenerowany HTML.

Cytat
tzn plik się otwiera ale nie daje mozliwosci zapisania

To w końcu o co chodzi?
tomek34
całość mechanizmu stanowią dwa pliki: test.php i download.php
pierwszy wyświetla zawartość drugi uruchamia ściaganie pliku.
test.php jest następujący:
  1. <?php
  2.             $dir = "D:sercomfotki";
  3.                  function printDir($dir)
  4.                  {
  5.                   $fd = opendir($dir);
  6.                       if(!$fd) return false;
  7.                                while (($file = readdir($fd)) !== false){
  8.                       $pos = strpos($file, ' ');
  9.                       if($file != "." && $file != ".." && $pos === false){
  10.                       echo("<a href=\"download.php?name=");
  11.                       echo("$file\" class='style3'>$file</a><br />");
  12.                       }
  13.                   }
  14.                   closedir($fd);
  15.               }
  16.               printDir($dir)
  17. ?>

dowload.php taki:
  1. <?php
  2. $filesPath = "./";
  3.  
  4. function securityCheck($name)
  5. {
  6.  $wyr = "^[a-z0-9_-]+(.[a-z0-9_-]+)*$";
  7.  return eregi($wyr, $name);
  8. }
  9. function send($fileName, $filePath)
  10. {
  11.  
  12.  $fd = fopen($filePath.$fileName,"r");
  13.  $size = filesize($filePath.$fileName);
  14.  $contents = fread($fd, filesize($filePath.$fileName));
  15.  
  16.  fclose($fd);
  17.  
  18.  header("Content-Type: application/octet-stream");
  19.  header("Content-Length: $size;");
  20.  header("Content-Disposition: attachment; filename=$fileName");
  21.  
  22.  echo $contents;
  23. }
  24. if(isSet($_GET['name'])){
  25.  if(!securityCheck($_GET['name'])){
  26.    echo('Nie ma takiego pliku na serwerze!');
  27.  }
  28.  else{
  29.    send($_GET['name'], $filesPath);
  30.  }
  31. }
  32. else{
  33.  echo('Nie ma takiego pliku na serwerze!');
  34. }
  35. ?>

Problem opisałem dokładnie na początku. Pliki są wyświetlane jako lista.
Po kliknięciu pojawia się akcja okienko wybory czy otworzyć plik czy zapisać.
Jak klikam otworzyć to niby probuje się otworzyć ale plik się nie pobiera i wyświetla błąd natomast jak klikam zapisz plik sie zapisuje ale jako zero bajtowy, czyli nie pobiera się właściwie.
erix
O, fajnie że powiedziałeś o skrypcie wysyłającym...

  1. <?php
  2. $fd = fopen($filePath.$fileName,"r");
  3. $size = filesize($filePath.$fileName);
  4. $contents = fread($fd, filesize($filePath.$fileName));
  5. ?>

Zamiast wysyłać od razu całość, porcjuj odczyt.
tomek34
ale w ten sposób to nie wysyła
erix
Pokaż, co zrobiłeś.
tomek34
uzyłem kod który napisałeś:
  1. <?php
  2. $fd = fopen($filePath.$fileName,"r");
  3. $size = filesize($filePath.$fileName);
  4. $contents = fread($fd, filesize($filePath.$fileName));
  5. ?>

ale te pliki przedtem działy ok w takim stanie jak były
erix
A czy Ty czytasz, co ja piszę?
Cytat
Zamiast wysyłać od razu całość, porcjuj odczyt.

A ja tylko zacytowałem Twój kod.
tomek34
wiec co moge poprawic bo te pliki nadal nie działają
erix
Popraw to, co napisałem - odczytujesz cały plik za jednym zamachem. Napisałem o porcjowaniu, to się do tego zastosuj, nie będę więcej męczył palców, żeby N-ty raz pisać o tym samym.
tomek34
dany plik do pobrania uruchamia właściwą akcję i próbuje się otworzyć we właściwej aplikacji ale ponieważ się nie pobiera występuje błąd. Czy te pliki php zawierają jakiś błąd?

żebym ja jescze wiedział co to znaczy porciować plik to byłoby cudownie.

czy ktos mi moze wyjasnic o co chodzi z tym porcjowaniem??
te dwa pliki przed miesiacem dzialaly mi bez zarzutu i nagle przestaly bez mojej ingernecji?
co sie moglo stac?
erix
U siebie masz tak:
  1. <?php
  2. fread($p, filesize('plik'));
  3. ?>


Czytaj segmentami, np. po 512 bajtów
  1. <?php
  2. while(!feof($p)){
  3.  echo fread($p, 512);
  4. }
  5. ?>


Cytat
te dwa pliki przed miesiacem dzialaly mi bez zarzutu i nagle przestaly bez mojej ingernecji?

Chyba tylko wróżka wie. Nic nie wiadomo o zmianach w oprogramowaniu, wersji IIS-a, systemu... Za dużo czynników.
tomek34
pliki testowałem na dwóch serwerach:
IIS 6.0 z mySQL 5.0.51 i PHP 5.2.6
oraz na
Linux apache z mySQL 4.1.22 i PHP5.2.3
na obu te same obiawy
erix
  1. zrobiłeś, jak pisałem?
  2. generalizacja MIME na application/octet-stream nieraz powoduje takie jaja
tomek34
zrobiłem tak ale pewnie źle:
  1. <?php
  2.  
  3. $filesPath = "./";
  4.  
  5. function securityCheck($name)
  6. {
  7.  $wyr = "^[a-z0-9_-]+(.[a-z0-9_-]+)*$";
  8.  return eregi($wyr, $name);
  9. }
  10. function send($fileName, $filePath)
  11. {
  12. //  if(!file_exists($filePath.$fileName)){
  13. //   echo('Nie ma takiego pliku na serwerze!');
  14. //   return;
  15. // }
  16.  $fd = fopen($filePath.$fileName,"r");
  17.  $size = filesize($filePath.$fileName);
  18.  //$contents = fread($fd, filesize($filePath.$fileName));
  19. while(!feof($fd)){
  20. echo fread($fd, 512);
  21. }
  22.  
  23.  fclose($fd);
  24.  
  25.  header("Content-Type: application/octet-stream");
  26.  header("Content-Length: $size;");
  27.  header("Content-Disposition: attachment; filename=$fileName");
  28.  
  29.  //echo $contents;
  30. }
  31. if(isSet($_GET['name'])){
  32.  if(!securityCheck($_GET['name'])){
  33.    echo('Nie ma takiego pliku na serwerze!');
  34.  }
  35.  else{
  36.    send($_GET['name'], $filesPath);
  37.  }
  38. }
  39. else{
  40.  echo('Nie ma takiego pliku na serwerze!');
  41. }
  42. ?>
erix
I co? Bez zmian?

Poza tym, wspomniałem coś o MIME.
tomek34
bardzo spowolnil...i zniknelo okienko wyboru czy otwierac czy sciagac a na tym mi zalezy zeby zostalo
a co do mime to w tym folderze sa rozne pliki i nie wiem czy wtedy trzebaby definiować każdy typ mime?
erix
Cytat
a co do mime to w tym folderze sa rozne pliki i nie wiem czy wtedy trzebaby definiować każdy typ mime?

Owszem.

Cytat
bardzo spowolnil...i zniknelo okienko wyboru czy otwierac czy sciagac a na tym mi zalezy zeby zostalo

To się innymi nagłówkami załatwia.

Żeby nie przeciągać - poszukaj gotowych skryptów downloadu i sprawdź, czy one działają. Jeśli nie - problemu szukaj w konfiguracji usługi.
tomek34
kompletny system tych dwóch pliczków do ściągania pochodzi z książki Marcina Lisa pt.
PHP. 101 praktycznych skryptów. Całość systemu działała mi na dwóch serwerach i na linuxie i na IIS i nagle nie wiem czemu przestała testowałem tez inny skrypt i jeden z nich działa ale nie spełnia założeń czyli nie listuje automatycznie wrzuconych plików (wymaga pisania specialnej listy) i nie ukrywa oryginalnej ścieżki do pliku co jest dla mnie bardzo ważne. Zaznaczam jeszcze raz ze całość systemu dowload działała bez zarzutu i z niewiadimych mi przyczyn przestała. na 100% jest to wina pliku download.php ponieważ ten od listowania plików działa bez zarzutu. Na prawdę już zgłupiałem i nie mam żadnego pomysłu na to co to może być. Ponownie proszę o pomoc.
pozdrawiam
Tomek
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.