Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [swfupload] Problem z nadpisywaniem istniejących plików
Forum PHP.pl > Forum > PHP
deha21
Witam,
W sumie nie wiem czy to bardziej flash czy php (bo flasha nie znam) ale mam problem z SWFUpload (www.swfupload.org). Używam go do mojego cmsa. Problem jest taki, że gdy wgrywam plik który już istnieje na serwerze to go nadpisuje. A powinien wyskoczyć komunikat, że plik istnieje. To raczej ten kod:
  1. // Validate that we won't over-write an existing file
  2. if (file_exists($save_path . $file_name)) {
  3. HandleError("Plik o tej nazwie już istnieje"); // moje spolszczenie ;)
  4. exit(0);
  5. }


Niestety nie działa :/ Próbowałem robić if'y przy kodzie wgrywania plików na serwer ale też nic. To ten kod (bez mojej przeróbki):
  1. if (!@move_uploaded_file($_FILES[$upload_name]["tmp_name"], '../'.$_POST['directory'].'/'.$file_name)) {
  2. HandleError("Błąd przy wgrywaniu pliku. Sprawdź czy taki plik już nie istnieje.");
  3. exit(0);
  4. }


Pomożecie?
erix
Cytat
  1. if (file_exists($save_path . $file_name)) {

Fajnie, że wiemy, jak są deklarowane te zmienne.
deha21
Racja. Trochę za dużo kodu, żeby to pokazać więc streszczę to tak:
$file_name - nazwa pliku, prawidłowo przesyłana (bo zapisuje uploadowany plik pod tą nazwą)
$save_path - właśnie obadałem skrypt dokładniej i stwierdziłem, że nie ma jej zdeklarowanej, więc zamiast niej wrzuciłem konkretną ścieżkę:
  1. if (file_exists('../'.$_POST['directory'].'/'.$file_name)) {
  2. HandleError("Plik o tej nazwie już istnieje.");
  3. exit(0);
  4. }


I nic :/
erix
Może lepiej wrzuć cały skrypt uploadu...
deha21
  1. <?php
  2.  
  3. // Check post_max_size (http://us3.php.net/manual/en/features.file-upload.php#73762)
  4. $POST_MAX_SIZE = ini_get('post_max_size');
  5. $unit = strtoupper(substr($POST_MAX_SIZE, -1));
  6. $multiplier = ($unit == 'M' ? 1048576 : ($unit == 'K' ? 1024 : ($unit == 'G' ? 1073741824 : 1)));
  7.  
  8. if ((int)$_SERVER['CONTENT_LENGTH'] > $multiplier*(int)$POST_MAX_SIZE && $POST_MAX_SIZE) {
  9. header("HTTP/1.1 500 Internal Server Error"); // This will trigger an uploadError event in SWFUpload
  10. echo "Za duży rozmiar pliku.";
  11. exit(0);
  12. }
  13.  
  14. // Settings
  15. // The path were we will save the file (getcwd() may not be reliable and should be tested in your environment)
  16. $upload_name = "Filedata";
  17. $max_file_size_in_bytes = 2147483647; // 2GB in bytes
  18. $extension_whitelist = array("jpg", "gif", "png","bmp","jpeg","tiff","txt","doc","docx","rtf","odt","pdf","zip","rar","mp3","wav","midi","wma","ogg","mpg","mpeg","avi","flv","mp4","wmv","swf","pdf"); // Allowed file extensions
  19. $valid_chars_regex = '.A-Z0-9_ !@#$%^&()+={}\[\]\',~`-'; // Characters allowed in the file name (in a Regular Expression format)
  20.  
  21. // Other variables
  22. $MAX_FILENAME_LENGTH = 260;
  23. $file_name = "";
  24. $file_extension = "";
  25. $uploadErrors = array(
  26. 0=>"Pliki wgrane poprawne",
  27. 1=>"Za duży rozmiar pliku (sprawdź php.ini)",
  28. 2=>"Za duży rozmiar pliku (sprawdź plik akcji)",
  29. 3=>"Tylko niektóre pliki zostały wgrane",
  30. 4=>"Żaden plik nie został wgrany",
  31. 6=>"Brak tymczasowego folderu"
  32. );
  33.  
  34. // Validate the upload
  35. if (!isset($_FILES[$upload_name])) {
  36. HandleError("No upload found in \$_FILES for " . $upload_name);
  37. exit(0);
  38. } else if (isset($_FILES[$upload_name]["error"]) && $_FILES[$upload_name]["error"] != 0) {
  39. HandleError($uploadErrors[$_FILES[$upload_name]["error"]]);
  40. exit(0);
  41. } else if (!isset($_FILES[$upload_name]["tmp_name"]) || !@is_uploaded_file($_FILES[$upload_name]["tmp_name"])) {
  42. HandleError("Upload failed is_uploaded_file test.");
  43. exit(0);
  44. } else if (!isset($_FILES[$upload_name]['name'])) {
  45. HandleError("Plik nie ma nazwy.");
  46. exit(0);
  47. }
  48.  
  49. // Validate the file size (Warning: the largest files supported by this code is 2GB)
  50. $file_size = @filesize($_FILES[$upload_name]["tmp_name"]);
  51. if (!$file_size || $file_size > $max_file_size_in_bytes) {
  52. HandleError("Za duży rozmiar pliku");
  53. exit(0);
  54. }
  55.  
  56. if ($file_size <= 0) {
  57. HandleError("File size outside allowed lower bound");
  58. exit(0);
  59. }
  60.  
  61. // Validate file name (for our purposes we'll just remove invalid characters)
  62. $file_name = preg_replace('/[^'.$valid_chars_regex.']|\.+$/i', "", basename($_FILES[$upload_name]['name']));
  63. if (strlen($file_name) == 0 || strlen($file_name) > $MAX_FILENAME_LENGTH) {
  64. HandleError("Nieprawidłowa nazwa pliku");
  65. exit(0);
  66. }
  67.  
  68. // Validate that we won't over-write an existing file
  69. if (file_exists('../'.$_POST['directory'].'/'.$file_name)) {
  70. HandleError("Plik o tej nazwie już istnieje.");
  71. exit(0);
  72. }
  73.  
  74. // Validate file extension
  75. $path_info = pathinfo($_FILES[$upload_name]['name']);
  76. $file_extension = $path_info["extension"];
  77. $is_valid_extension = false;
  78. foreach ($extension_whitelist as $extension) {
  79. if (strcasecmp($file_extension, $extension) == 0) {
  80. $is_valid_extension = true;
  81. break;
  82. }
  83. }
  84. if (!$is_valid_extension) {
  85. HandleError("Nieprawidłowe rozszrzenie pliku.");
  86. exit(0);
  87. }
  88.  
  89. if (!@move_uploaded_file($_FILES[$upload_name]["tmp_name"], '../'.$_POST['directory'].'/'.$file_name)) {
  90. HandleError("Błąd przy wgrywaniu pliku.");
  91. exit(0);
  92. }
  93.  
  94. exit(0);
  95.  
  96. function HandleError($message) {
  97. echo $message;
  98. }
  99. ?>
thek
Lepiej sprawdź czy masz safe_mode na serwerze winksmiley.jpg Jeśli tak to file_exists może Ci wywalać false nawet gdy plik istnieje ;]
deha21
Nie wiem czy jest włączone, nie chce mi się sprawdzać winksmiley.jpg Ale w innych skryptach file_exists działa jak należy więc to raczej nie to.

Ktoś pomoże?
Safe_mode czy włączone, czy wyłączone nic nie zmienia.
erix
a clearstatcache przed file_exists?
deha21
Hmm nie wiem czy to dobrze stosuje ale robiłem tak:
  1. // Validate that we won't over-write an existing file
  2. if (clearstatcache(file_exists('../'.$_POST['directory'].'/'.$file_name))) {
  3. HandleError("Plik o tej nazwie już istnieje.");
  4. exit(0);
  5. }
  6. //oraz na początku

I nie działa. W manualu nie widzę żadnych przykładów.
erix
Nie ma prawa zadziałać:
  • clearstatcache:
    Cytat
    void clearstatcache ( void )

    - void = pustka = nie przyjmuje żadnego parametru.
  • funkcja CZYŚCI BUFOR dla operacji IO, a nie wpływa na file_exists bezpośrednio, że trzeba jej wynik przekazywać jako parametr
  • funkcje wykonają się w odwrotnej kolejności niż napisanej (najpierw file_exists, potem clearstatcache)
deha21
Więc jak zrobić żeby to zadziałało?
Retio
  1. if (file_exists('../'.$_POST['directory'].'/'.$file_name)) {
  2. HandleError("Plik o tej nazwie już istnieje.");
  3. exit(0);
  4. }
deha21
Niestety nic nie dało. Nie nadpisuje pliku ale nie wyświetla błędu... Możliwe, że to błąd tylko w wyświetlaniu? Reszta wyświetleń działa jak należy :/
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.