Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: serwer + operacje na plikach
Forum PHP.pl > Forum > Przedszkole
bailador
Witam,
oto opis sytuacji. Muszę napisać skrypt, który będzie wysyłał pliki na serwer, przeglądał je, kasował. Ma też być możliwość pobrania pliku z serwera. Dodatkowe założenie: wszystko ma być zawarte w jednym pliku php.

To jest to, co do tej pory stworzyłem:

  1. <?php 
  2.  
  3. $id = $_GET['id'];
  4.  
  5. if($id != 0)
  6. {
  7. $plik = "pliki/".$id;
  8.  
  9. header('Content-Description: File Transfer');
  10. header('Content-Type: application/octet-stream');
  11. header('Content-Disposition: attachment; filename='.basename($plik));
  12. header('Content-Transfer-Encoding: binary');
  13. header('Expires: 0');
  14. header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
  15. header('Pragma: public');
  16. header('Content-Length: ' . filesize($plik));
  17.  
  18. readfile($plik);
  19. exit();
  20.  
  21. }
  22. ?>
  23.  
  24. <?php
  25. $MaxFileSize=100000;
  26. ?>
  27.  
  28.  
  29.  
  30. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  31. <html xmlns="http://www.w3.org/1999/xhtml">
  32. <head>
  33. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  34. <title>Pliki</title>
  35.  
  36. <style type="text/css">
  37. body {
  38. font-family: Verdana, Arial, Helvetica, sans-serif;
  39. font-size: 12px;
  40. background-color: #EBEBEB;
  41. }
  42. </style>
  43. </head>
  44.  
  45. <body>
  46.  
  47. <h1>Serwer</h1>
  48. <hr />
  49.  
  50. <h3>Dodaj pliki:</h3>
  51.  
  52. <?php
  53. // upload plików
  54. if($id == 0)
  55. {
  56. for($i = 0; $i < count($_FILES["pliki"]["name"]); $i++)
  57. {
  58. $spr_nazwe = split(" ", $_FILES['pliki']['name'][$i]);
  59.  
  60. if(count($spr_nazwe) > 1)
  61. echo "<div style=\"color:red; text-align:center\">Niedozwolone uzycie spacji w nazwie pliku:<b> ".$_FILES['pliki']['name'][$i]."</b>.</div><br />";
  62. else
  63. {
  64. $UploadFile = "pliki/".$_FILES['pliki']['name'][$i];
  65.  
  66. if (is_uploaded_file($_FILES['pliki']['tmp_name'][$i]))
  67. {
  68. if ($_FILES['pliki']['size'][$i] > $MaxFileSize)
  69. { 
  70. echo "<div style=\"color:red; text-align:center\">Plik nr $i jest za duży!</div><br />"; 
  71. }
  72. else
  73. { 
  74. if ( move_uploaded_file( $_FILES['pliki']['tmp_name'][$i], $UploadFile ) )
  75. {
  76. echo "<div style=\"color:green; text-align:center\">Plik:<b> ".$_FILES['pliki']['name'][$i]."</b> został poprawnie uploadowany i skopiowany w nowe miejsce</div><br />";
  77. }
  78. else
  79. {
  80. echo "<div style=\"color:red; text-align:center\">Błąd przy uploadowaniu pliku:<b> ".$_FILES['pliki']['name'][$i]."</b>.</div><br />";
  81. }
  82. }
  83. }
  84. }
  85. }
  86. }
  87. ?>
  88.  
  89. <div align="center">
  90. <form enctype="multipart/form-data" method="post" action="przegladarka.php">
  91. <input type="hidden" name="MAX_FILE_SIZE" value="<?php echo $MaxFileSize;?>">
  92. <table bgcolor="#A0A0A0">
  93. <tr>
  94. <td>Plik 1:</td> <td><input type="file" size="40" name="pliki[]" value=""></td>
  95. </tr>
  96. <tr>
  97. <td>Plik 2:</td> <td><input type="file" size="40" name="pliki[]" value=""></td>
  98. </tr>
  99. <tr>
  100. <td>Plik 3:</td> <td><input type="file" size="40" name="pliki[]" value=""></td>
  101. </tr>
  102. </table>
  103. <input type="submit" name="Wyślij" value="Wyslij"></form>
  104. </div><hr />
  105.  
  106.  
  107. <h3>Pliki na serwerze:</h3>
  108.  
  109. <?php
  110. // przeglądanie plików znajdujących się na serwerze
  111. $folder = dir("pliki");
  112.  
  113. while($plik = $folder->read()) 
  114. {
  115. if (($plik != '.') && ($plik != '..')) 
  116. {
  117. $nazwa = pathinfo($plik);
  118.  $pliki[$nazwa["basename"]] = $nazwa["extension"];
  119.  
  120.  $dodaj = true;
  121.  
  122. for($i = 0; $i < count($typ); $i++)
  123. if ($typ[$i] == $nazwa["extension"]) $dodaj = false;
  124.  
  125.  if ($dodaj == true) 
  126. $typ[] = $nazwa["extension"];
  127.  }
  128. }
  129.  
  130. $folder->close();
  131.  
  132. for($i = 0; $i < count($typ); $i++) 
  133. {
  134. echo "<ul><b>".$typ[$i]."</b>";
  135.  
  136.  foreach($pliki as $klucz => $wartosc)
  137. if ($wartosc == $typ[$i]) 
  138. echo "<li><a href=przegladarka.php?id=".$klucz.">" .$klucz. "</a></li>";
  139.  
  140.  echo "</ul>";
  141. }
  142.  
  143. ?>
  144. </body>
  145. </html>


Oczywiście ta implementacja jest wielką podstawą i nie posiada zabezpieczeń. Jednak na tym etapie nie mam się na tym skupiać.
Problem polega na tym, że część plików kopiuje się do odpowiedniego katalogu a część nie (przy czym nie wyskakuje żaden komunikat). To samo dzieje się przy pobieraniu pliku (pobieranie poprzez kliknięcie na link pliku) - część wgranych plików można pobrać - pozostałe nie reagują. Gdzie jest błąd?

Proszę o pomoc.
bailador
Dodałem do tego kodu wyżej funkcjonalność: usuwanie plików. Podobnie jak w poprzednich dwóch przypadkach jest problem z kasowaniem pliku (nie dają się skasować dokładnie te, których nie można również pobrać).

  1. <?php
  2. // usuwanie plikow
  3. $do_usuniecia = $_GET["usun"];
  4.  
  5. if($do_usuniecia != 0)
  6. {
  7. unlink("pliki/".$do_usuniecia);
  8. }
  9.  
  10. ?>


Męczę się z tym cały dzień więc bardzo bym prosił o jakieś wskazówki.
marcio
Ja mam tak sciaganie w shell'u
  1. <?php
  2. header('Content-Type: application/x-unknown');
  3. header('Content-Disposition: attachment; filename='.$plik);
  4. readfile($plik);
  5. ?>

I mi dziala a co do usuwania dodaj przed katalogiem $_SERVER['DOCUMENT_ROOT']
bailador
Podmieniłem ten fragment kodu:

  1. <?php
  2. header('Content-Description: File Transfer');
  3. header('Content-Type: application/octet-stream');
  4. header('Content-Disposition: attachment; filename='.basename($plik));
  5. header('Content-Transfer-Encoding: binary');
  6. header('Expires: 0');
  7. header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
  8. header('Pragma: public');
  9. header('Content-Length: ' . filesize($plik));
  10.  
  11. readfile($plik);
  12. exit();
  13. ?>


na to co podpowiedziałeś. Niestety - nadal to samo.
marcio
Jaka przegladarka??
bailador
firefox... ale pod ie jest tak samo
marcio
Dziwne mi pod FF dziala dobrze teraz nie pamietam czy nie dzieje sie tak z powodu chmodow probojesz sciaganc plik ktory nie ma prawa zapisy(w)questionmark.gif
bailador
Zgodnie z sugestią zmieniłem trochę kod i dodałem funkcję chmod() nadająca prawa dostępu do pliku:

  1. <?php
  2. if (is_uploaded_file($_FILES['pliki']['tmp_name'][$i]))
  3. {
  4. if ($_FILES['pliki']['size'][$i] > $MaxFileSize)
  5. { 
  6. echo "<div style=\"color:red; text-align:center\">Plik nr $i jest za duży!</div><br />"; 
  7. }
  8. else
  9. { 
  10. if (move_uploaded_file( $_FILES['pliki']['tmp_name'][$i], $UploadFile ) )
  11. {
  12. echo "<div style=\"color:green; text-align:center\">Plik:<b> ".$_FILES['pliki']['name'][$i]."</b> został poprawnie uploadowany i skopiowany w nowe miejsce</div><br />";
  13. chmod($UploadFile, 0755);
  14. }
  15. else
  16. {
  17. echo "<div style=\"color:red; text-align:center\">Błąd przy uploadowaniu pliku:<b> ".$_FILES['pliki']['name'][$i]."</b>.</div><br />";
  18. }
  19. }
  20. }
  21. ?>


Niestety - nadal to samo. Nie można załadować niektórych plików a z tym, które już dadzą się wgrać, części nie da się pobrać ani usunąć.
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.