Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Sprawdzanie rozmiaru pliku przed przesłaniem
Forum PHP.pl > Forum > Przedszkole
camilost
Witam, próbowałem sam sobie zrobić, ale coś mi nie idzie.
Chciałbym, aby przed przesłaniem pliku, sprawdzało jego rozmiar pomiędzy plikiem gotowym już na serwerze

Mój kod:
  1. function rename_if_exists($dir, $filename) {
  2. $ext = strrchr($filename, '.');
  3. $prefix = substr($filename, 0, -strlen($ext));
  4. $rozmiar = filesize($filename);
  5.  
  6. $i = 0;
  7. while(file_exists($dir . $filename)) { // If file exists, add a number to it.
  8. $rozmiar = $plik_rozmiar;
  9. $filename = $prefix . ++$i . $ext;
  10. }
  11.  
  12. return $filename;
  13. }
  14.  
  15.  
  16. if (!empty($_FILES))
  17. {
  18. $plik_nazwa = rename_if_exists('pliki/', $plik_nazwa);
  19. $plik_tmp = $_FILES['plik']['tmp_name'];
  20. $plik_nazwa = $_FILES['plik']['name'];
  21. $plik_rozmiar = $_FILES['plik']['size'];
  22.  
  23. if(is_uploaded_file($plik_tmp)) {
  24. if($rozmiar != $plik_rozmiar) { // probowalem tez z <>
  25. move_uploaded_file($plik_tmp, "pliki/$plik_nazwa");
  26. echo "Plik: <strong>$plik_nazwa</strong> o rozmiarze <strong>$plik_rozmiar bajtów</strong> został przesłany na serwer!";
  27. }
  28. }
  29. }


Ciągle przesyła pliki o tych samych rozmiarach.
nospor
$rozmiar = $plik_rozmiar;

A magiczną zmienną $plik_rozmiar to niby skad bierzesz?
camilost
Dałem
  1. $plik_rozmiar = $_FILES['plik']['size'];
przed funkcją i dalej nici, kombinowałem
dalej nici, nie potrafię dobrze zbudować tego ;/
Ktoś pomoże? sad.gif
nospor
No ale co przed funkcją... poczytaj w manualu o zasięgu zmiennych. Masz tam to dokładnie wyjaśnione.
redeemer
W ogóle ten skrypt wygląda jak jakiś chaotyczny zlepek wacko.gif, ale jeżeli dobrze zrozumiałem idee to:
Linia 4 i 8 do zmiany na
  1. $rozmiar = filesize($dir . $filename);

W funkcji zwróć sobie i rozmiar pliku i "wolną" nazwę:
  1. return array('filesize'=>$rozmiar,'filename'=>$filename);
Linia 18 zmiana na:
  1. list($rozmiar, $plik_nazwa) = rename_if_exists('pliki/', $_FILES['plik']['name']);
Linia 20 do wywalenia.
camilost
@nospor, właśnie też kombinowałem, ale albo coś innego źle zrobiłem i nic mi nie zwracało, albo gdzieś indziej błąd popełniałem.
Złe kombinowanie sad.gif
@redeemer Wciąż źle sad.gif Nie wiem co dalej sad.gif próbowałem też różnie przestawiaać/zamieniać. Wyniki były 3
1. Wyskakuje 'Array' zamiast nazwy piku oraz rozmiar
2. Nic nie wyskakuje w obu
3. Wyskakuje nazwa podstawowa (taka jaką wysyłam),a błąd z rozmiarem
Być może źle wkleiłem kod? ; / I były nietrafne moje próby? Można prosić o aktualizację powyższych co do poniższego? Próbowałem już wiele razy, lecz bez skutku sad.gif(.
Próbuję coś stworzyć, ale nawet manual np. o list i wiele przykładów z google, za wiele mi nie dały do myślenia sad.gif

Powinno: zmieniać nazwę pliku, jeśli już istnieje na $i++, gdy rozmiar pliku, który jest pod tą samą nazwą początkową: $plik_nazwa = $_FILES['plik']['name']; jest inny od aktualnego przesyłać plik.
W innym wypadków, usuwać plik tymczasowy, a orginału o tym samy rozmiarze i nazwie nie nadpisywać.

Oryginalny kod :
  1. <?php
  2. function rename_if_exists($dir, $filename) {
  3. $ext = strrchr($filename, '.');
  4. $prefix = substr($filename, 0, -strlen($ext));
  5.  
  6. $i = 0;
  7. while(file_exists($dir . $filename)) { // If file exists, add a number to it.
  8. $filename = $prefix . ++$i . $ext;
  9. }
  10. return $filename;
  11. }
  12.  
  13.  
  14. if (!empty($_FILES))
  15. {
  16. $plik_nazwa = $_FILES['plik']['name'];
  17. $plik_nazwa = rename_if_exists('pliki/', $plik_nazwa);
  18. $plik_tmp = $_FILES['plik']['tmp_name'];
  19. $plik_rozmiar = $_FILES['plik']['size'];
  20.  
  21. if(is_uploaded_file($plik_tmp)) {
  22. move_uploaded_file($plik_tmp, "pliki/$plik_nazwa");
  23. echo "Plik: <strong>$plik_nazwa</strong> o rozmiarze <strong>$plik_rozmiar bajtów</strong> został przesłany na serwer!";
  24. }
  25. }
  26. ?>


Dobranoc wszystkim smile.gif)
IProSoft
Nie do końca rozumiem Twoje zdanie w którym piszesz co robić jeśli plik istnieje i ma ten sam rozmiar, wg schematu nic nie robić więc tak jest:

  1. function rename_if_exists($dir, $filename) {
  2. $ext = strrchr($filename, '.');
  3. $prefix = substr($filename, 0, -strlen($ext));
  4. $rozmiar = 0;
  5.  
  6. $i = 0;
  7. while(file_exists($dir . $filename)) { // If file exists, add a number to it.
  8. $rozmiar = filesize($dir . $filename); // rozmiar zwracamy dopiero gdy plik istnieje
  9. $filename = $prefix . ++$i . $ext;
  10. }
  11.  
  12. return array(
  13. 'filesize' => $rozmiar,
  14. 'filename' => $filename
  15. );
  16. }
  17.  
  18.  
  19. if (!empty($_FILES))
  20. {
  21.  
  22. $array = rename_if_exists('pliki/', $_FILES['plik']['name']);
  23. $plik_tmp = $_FILES['plik']['tmp_name'];
  24. $plik_nazwa = $_FILES['plik']['name'];
  25. $plik_rozmiar = $_FILES['plik']['size'];
  26.  
  27. if(is_uploaded_file($plik_tmp)) {
  28. if($array['filesize'] != $plik_rozmiar){
  29. move_uploaded_file($plik_tmp, "pliki/$plik_nazwa");
  30. echo "Plik: <strong>$plik_nazwa</strong> o rozmiarze <strong>$plik_rozmiar bajtów</strong> został przesłany na serwer!";
  31. }
  32. }
  33. }
camilost
Niestety, może Twój kod zadziałał co do tego co chciałem, ale nazwy nie zmieniał, gdy plik innej wielkości ).
Odkrył się nowy problem, który sam rozwiązałem (mam nadzieję, że w miarę dobrze) - proszę zobaczyć(porównać) linie:

Musiałem zmienić na takie, i wszystko działa należycie!
  1. $array = rename_if_exists('pliki/', $_FILES['plik']['name']);
  2. $plik_nazwa = $array['filename'];
  3. $plik_tmp = $_FILES['plik']['tmp_name'];
  4. $plik_rozmiar = $_FILES['plik']['size'];


Proszę o zamknięcie tematu.
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.