Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Multiupload
Forum PHP.pl > Forum > Przedszkole
Turson
Piszę upload zdjęć, gdzie można ich wrzucić kilka za jednym razem. Np. nie więcej niż 3.

Formularz:
  1. <form enctype="multipart/form-data" action="index.php?page=test" method="POST">
  2. <input type="file" name="plik[]" multiple="multiple" />
  3. <input type="submit" name="submit" value="Wyślij pliki" />
  4. </form>


Problem pojawia się z wysyłaniem kilku plików. Walidacja rozmiaru, tworzenie miniaturki etc. już mam - w pojedynczym pliku. Nie wiem natomiast jak to zrobić, aby cała procedura obejmowała wszystkie wrzucone pliki...
Jak zrobić multi upload? Czego użyć? Szukałem w sieci, ale wszystko mało jasne.
Crozin
1. Utwórz sobie testowy skrypt o treści:
  1. <pre><?php var_dump($_POST, $_FILES) ?></pre>

2. Utwórz sobie formularz do wysłania pojedynczego pliku prowadzący do skryptu z punktu pierwszego.
3. Utwórz sobie formularz do wysłania wielu plików prowadzący do skryptu z punktu pierwszego.
4. Porównaj wyniki działania obu.
Turson
Hmm raczej chodzi mi o użycie jakiejś funkcji, która powiąże procedurę wrzucania dla wszystkich plików.
aras785
To pokaz kod dla pojedynczego pliku to się zrobi smile.gif

  1. function upload($form,$i) {
  2. //twoj obecny skrypt
  3. }
  4. if(isset($_FILES['pliki'])) {
  5. for($i=0;$i<count($_FILES['pliki']);$i++) {
  6. upload('pliki',$i); //twoja fukcja
  7. }
  8. }


I myśle, że tak będzie najszybciej.
Turson
Cały kod:

  1. <?php
  2. if(isset($_POST["submit"]))
  3. {
  4. if(isset($_FILES['plik']))
  5. {
  6.  
  7. $plik_tmp = $_FILES['plik']['tmp_name'];
  8. $plik_nazwa = $_FILES['plik']['name'];
  9. $plik_rozmiar = $_FILES['plik']['size'];
  10. $plik_typ = $_FILES['plik']['type'];
  11. list($oldWidth, $oldHeight) = getimagesize($plik_tmp);
  12.  
  13. $allowed = array('image/pjpeg', 'image/jpeg', 'image/JPG', 'image/X-PNG', 'image/PNG', 'image/png', 'image/x-png');
  14. if(in_array($plik_typ, $allowed))
  15. {
  16. if($plik_rozmiar<='1048576')
  17. {
  18. $l1 = rand(1,9);$l2 = rand(1,9);$l3 = rand(1,9);$l4 = rand(1,9);$l5 = rand(1,9);
  19. $l6 = rand(1,9);$l7 = rand(1,9);$l8 = rand(1,9);$l9 = rand(1,9);$l10 = rand(1,9);
  20. $l11 = rand(1,9);$l12 = rand(1,9);$l13 = rand(1,9);$l14 = rand(1,9);$l15 = rand(1,9);
  21. $nazwa = $l1.$l2.$l3.$l4.$l5.$l6.$l7.$l8.$l9.$l10.$l11.$l12.$l13.$l14.$l15;
  22. if($oldHeight<='500')
  23. {
  24. move_uploaded_file($plik_tmp, "img/id_$nazwa.jpg");
  25. echo "Plik: <strong>$plik_nazwa</strong> o rozmiarze
  26. <strong>$plik_rozmiar bajtów</strong> został przesłany na serwer!";
  27. }
  28. else
  29. {
  30. $skala = 500/$oldHeight;
  31. $newWidth = round($oldWidth*$skala);
  32. $maly = ImageCreateTrueColor($newWidth, 500);
  33. $duzy = ImageCreateFromJPEG("$plik_tmp");
  34. ImageCopyResampled($maly,$duzy,0,0,0,0,$newWidth,500,$oldWidth,$oldHeight);
  35. ImageJPEG($maly, "img/id_$nazwa.jpg", 100);
  36. echo "Plik: <strong>$plik_nazwa</strong> o rozmiarze
  37. <strong>$plik_rozmiar bajtów</strong> został przesłany na serwer!";
  38. }
  39. }
  40. else
  41. {
  42. echo "Maksymalny rozmiar to 1Mb";
  43. }
  44. }
  45. else
  46. {
  47. echo 'Niedozwolony format';
  48. }
  49. }
  50. else
  51. {
  52. echo "Żaden plik nie został wybrany";
  53. }
  54. }
  55. else
  56. {
  57. echo '
  58. <form enctype="multipart/form-data" action="index.php?page=test" method="POST">
  59. <input name="plik" type="file" multiple="multiple"/>
  60. <input type="submit" name="submit" value="Wyślij plik" />
  61. </form> ';
  62. }
  63. ?>


Więc to co podałeś wklepać do kodu?
aras785
To zależy czy chcesz wgrać pliki na serwer gdy wszystkie przejdą poprawnie walidacje (rozmiar itd), czy też może być że ten co jest ok to się wgrywa?
Turson
Wszystkie muszą przejść proces walidacji, który podałem w kodzie:
-sprawdzenie wagi
-sprawdzenie formatu
-sprawdzenie rozmiaru i ew. pomniejszenie




Edit:
Napisałem kod, który działa. Jak tylko zrobić, żeby można było wgrać nie więcej niż np. 3 pliki?

  1. <?php
  2. if(isset($_POST["submit"]))
  3. {
  4. for($i=0; $i < 3; $i++)
  5. {
  6. if(@is_uploaded_file($_FILES['plik']['tmp_name'][$i]))
  7. {
  8. list($oldWidth, $oldHeight) = getimagesize($_FILES['plik']['tmp_name'][$i]);
  9. $l1 = rand(1,9);$l2 = rand(1,9);$l3 = rand(1,9);$l4 = rand(1,9);$l5 = rand(1,9);
  10. $l6 = rand(1,9);$l7 = rand(1,9);$l8 = rand(1,9);$l9 = rand(1,9);$l10 = rand(1,9);
  11. $l11 = rand(1,9);$l12 = rand(1,9);$l13 = rand(1,9);$l14 = rand(1,9);$l15 = rand(1,9);
  12. $nazwa = $l1.$l2.$l3.$l4.$l5.$l6.$l7.$l8.$l9.$l10.$l11.$l12.$l13.$l14.$l15;
  13. if($_FILES['plik']['size'][$i]<='1048576')
  14. {
  15. $allowed = array('image/pjpeg', 'image/jpeg', 'image/JPG', 'image/X-PNG', 'image/PNG', 'image/png', 'image/x-png');
  16. if(in_array($_FILES['plik']['type'][$i], $allowed))
  17. {
  18. if($oldHeight<='500')
  19. {
  20. move_uploaded_file($_FILES['plik']['tmp_name'][$i], "img/a_$nazwa.jpg");
  21. echo 'Plik: <strong>"'.$_FILES['plik']['name'][$i].'"</strong>został przesłany na serwer!<br>';
  22. }
  23. else
  24. {
  25. $skala = 500/$oldHeight;
  26. $newWidth = round($oldWidth*$skala);
  27. $maly = ImageCreateTrueColor($newWidth, 500);
  28. $duzy = ImageCreateFromJPEG($_FILES['plik']['tmp_name'][$i]);
  29. ImageCopyResampled($maly,$duzy,0,0,0,0,$newWidth,500,$oldWidth,$oldHeight);
  30. ImageJPEG($maly, "img/a_$nazwa.jpg", 100);
  31. echo 'Plik: <strong>"'.$_FILES['plik']['name'][$i].'"</strong>został przesłany na serwer!<br>';
  32. }
  33. }
  34. else
  35. {
  36. echo "Niewłaściwy format";
  37. }
  38. }
  39. else
  40. {
  41. echo "Za duża waga";
  42. }
  43. }
  44. }
  45. }
  46. else
  47. {
  48. echo ' <form action="index.php?page=test2" method="post" enctype="multipart/form-data">
  49. <input type="file" name="plik[]" multiple="multiple" />
  50. <input type="submit" name="submit"/>
  51. </form>';
  52. }
  53. ?>


Próbowałem coś w stylu count($_FILES['plik']['tmp_name'][$i]) ale na darmo
aras785
Bo sprawdza się tak: count($_FILES['plik']['tmp_name'])
Turson
Niby działa. Widzicie jakiś błąd?

  1. if(isset($_POST["submit"]))
  2. {
  3. $l = count($_FILES['plik']['tmp_name']);
  4. if($l<=3)
  5. {
  6. for($i=0; $i < 3; $i++)
  7. {
  8. if(@is_uploaded_file($_FILES['plik']['tmp_name'][$i]))
  9. {
  10. list($oldWidth, $oldHeight) = getimagesize($_FILES['plik']['tmp_name'][$i]);
  11. $l1 = rand(1,9);$l2 = rand(1,9);$l3 = rand(1,9);$l4 = rand(1,9);$l5 = rand(1,9);
  12. $l6 = rand(1,9);$l7 = rand(1,9);$l8 = rand(1,9);$l9 = rand(1,9);$l10 = rand(1,9);
  13. $l11 = rand(1,9);$l12 = rand(1,9);$l13 = rand(1,9);$l14 = rand(1,9);$l15 = rand(1,9);
  14. $nazwa = $l1.$l2.$l3.$l4.$l5.$l6.$l7.$l8.$l9.$l10.$l11.$l12.$l13.$l14.$l15;
  15. if($_FILES['plik']['size'][$i]<='1048576')
  16. {
  17. $allowed = array('image/pjpeg', 'image/jpeg', 'image/JPG', 'image/X-PNG', 'image/PNG', 'image/png', 'image/x-png');
  18. if(in_array($_FILES['plik']['type'][$i], $allowed))
  19. {
  20. if($oldHeight<='500')
  21. {
  22. move_uploaded_file($_FILES['plik']['tmp_name'][$i], "img/a_$nazwa.jpg");
  23. echo 'Plik: <strong>"'.$_FILES['plik']['name'][$i].'"</strong>został przesłany na serwer!<br>';
  24. }
  25. else
  26. {
  27. $skala = 500/$oldHeight;
  28. $newWidth = round($oldWidth*$skala);
  29. $maly = ImageCreateTrueColor($newWidth, 500);
  30. $duzy = ImageCreateFromJPEG($_FILES['plik']['tmp_name'][$i]);
  31. ImageCopyResampled($maly,$duzy,0,0,0,0,$newWidth,500,$oldWidth,$oldHeight);
  32. ImageJPEG($maly, "img/a_$nazwa.jpg", 100);
  33. echo 'Plik: <strong>"'.$_FILES['plik']['name'][$i].'"</strong>został przesłany na serwer!<br>';
  34. }
  35. }
  36. else
  37. {
  38. echo 'Plik "'.$_FILES['plik']['name'][$i].'" ma niewłaściwy format.<br>';
  39. }
  40. }
  41. else
  42. {
  43. echo 'Plik "'.$_FILES['plik']['name'][$i].'" waży za dużo.<br>';
  44. }
  45. }
  46. }
  47. }
  48. else
  49. {
  50. echo "Za duzo";
  51. }
  52. }
  53. else
  54. {
  55. echo ' <form action="index.php?page=test2" method="post" enctype="multipart/form-data">
  56. <input type="file" name="plik[]" multiple="multiple" />
  57. <input type="submit" name="submit"/>
  58. </form>';
  59. }
aras785
u mnie chodzi. Stwórz folder: img biggrin.gif
Turson
Mam kolejny problem. Mianowicie liczba plików ma być mniejsza bądź równa 3 ale też większa od 0 rzecz jasna.
Zmieniłem więc warunek z powyższego kodu na:
  1. $l = count($_FILES['plik']['tmp_name']);
  2. if($l>0 && $l<=3)
  3. {
  4. //ok
  5. }
  6. else
  7. {
  8. //za duzo lub brak plikow
  9. }

Ale nie działa w przypadku braku plikow. Jesli wrzuce wiecej niz 3 wywala blad wiec ok. Niestety jak nie dodam zadnego to pusta strona
buliq
error_reporting i display_errors, zobacz jaki to błąd
Turson
Całość kodu wygląda jak w poście #9.
W
  1. if(@is_uploaded_file($_FILES['plik']['tmp_name'][$i]))

mam wyłączone wyświetlanie błędów. Kiedy włączę jest:
Cytat
Notice: Undefined offset: 1 in test2.php on line 11

Notice: Undefined offset: 2 in test2.php on line 11

gdzie linia 11 to właśnie kod, który wyżej podałem.

Te błędy wyświetlają się, kiedy nie prześlę żadnego pliku.


Tylko że to wygląda tak:
  1. $l = count($_FILES['plik']['tmp_name']);
  2. if($l>0 && $l<=3)
  3. {
  4. for($i=0; $i < 3; $i++)
  5. {
  6. if(is_uploaded_file($_FILES['plik']['tmp_name'][$i]))
  7. {

więc is_uploaded_file nie powinno się de facto wykonać skoro warunek dot. liczby plików nie jest spełniony
aras785
  1. <?php
  2. if(isset($_POST["submit"]))
  3. {
  4. if(array_sum($_FILES['plik']['error'])==0) {
  5. $l = count($_FILES['plik']['tmp_name']);
  6. if($l>0 && $l<=3)
  7. {
  8. for($i=0; $i < 3; $i++)
  9. {
  10. if(@is_uploaded_file($_FILES['plik']['tmp_name'][$i]))
  11. {
  12. list($oldWidth, $oldHeight) = getimagesize($_FILES['plik']['tmp_name'][$i]);
  13. $l1 = rand(1,9);$l2 = rand(1,9);$l3 = rand(1,9);$l4 = rand(1,9);$l5 = rand(1,9);
  14. $l6 = rand(1,9);$l7 = rand(1,9);$l8 = rand(1,9);$l9 = rand(1,9);$l10 = rand(1,9);
  15. $l11 = rand(1,9);$l12 = rand(1,9);$l13 = rand(1,9);$l14 = rand(1,9);$l15 = rand(1,9);
  16. $nazwa = $l1.$l2.$l3.$l4.$l5.$l6.$l7.$l8.$l9.$l10.$l11.$l12.$l13.$l14.$l15;
  17. if($_FILES['plik']['size'][$i]<='1048576')
  18. {
  19. $allowed = array('image/pjpeg', 'image/jpeg', 'image/JPG', 'image/X-PNG', 'image/PNG', 'image/png', 'image/x-png');
  20. if(in_array($_FILES['plik']['type'][$i], $allowed))
  21. {
  22. if($oldHeight<='500')
  23. {
  24. move_uploaded_file($_FILES['plik']['tmp_name'][$i], "img/a_$nazwa.jpg");
  25. echo 'Plik: <strong>"'.$_FILES['plik']['name'][$i].'"</strong>został przesłany na serwer!<br>';
  26. }
  27. else
  28. {
  29. $skala = 500/$oldHeight;
  30. $newWidth = round($oldWidth*$skala);
  31. $maly = ImageCreateTrueColor($newWidth, 500);
  32. $duzy = ImageCreateFromJPEG($_FILES['plik']['tmp_name'][$i]);
  33. ImageCopyResampled($maly,$duzy,0,0,0,0,$newWidth,500,$oldWidth,$oldHeight);
  34. ImageJPEG($maly, "img/a_$nazwa.jpg", 100);
  35. echo 'Plik: <strong>"'.$_FILES['plik']['name'][$i].'"</strong>został przesłany na serwer!<br>';
  36. }
  37. }
  38. else
  39. {
  40. echo 'Plik "'.$_FILES['plik']['name'][$i].'" ma niewłaściwy format.<br>';
  41. }
  42. }
  43. else
  44. {
  45. echo 'Plik "'.$_FILES['plik']['name'][$i].'" waży za dużo.<br>';
  46. }
  47. }
  48. }
  49. }
  50. else
  51. {
  52. echo "Za duzo";
  53. }
  54. }else echo('Wybierz plik!');
  55. }
  56. else
  57. {
  58. echo ' <form action="" method="post" enctype="multipart/form-data">
  59. <input type="file" name="plik[]" multiple="multiple" />
  60. <input type="submit" name="submit"/>
  61. </form>';
  62. }
  63.  
  64. ?>


Pozdrawiam
buliq
Ponieważ w tablicy FILES te pliki dalej są, i ich ilość jest zgodna z tym ile pól jest w formularzu. Musisz sprawdzać czy klucz error nie jest równy UPLOAD_ERR_NO_FILE, np:
  1. $ile = 0;
  2. foreach($_FILES['plik']['error'] as $k => $v) {
  3. if ($v != UPLOAD_ERR_NO_FILE) {
  4. $ile++;
  5. }
  6. }


i w warunku użyjesz $ile.

Natomiast dalej w for warunek działania powinien być $i < $ile
Turson
@aras785, Twój kod działał idealnie na testach. Gdy połączyłem go z innym czyli tak jak miało być, pojawiły się błędy.

Wybieram 2 pliki *.jpg i klikam submit:
Cytat
Notice: Undefined index: plik in D:\Program Files (x86)\xampp\htdocs\ogl\include\dodaj2.php on line 37

czyli
  1. if(array_sum($_FILES['plik']['error'])==0)


Cytat
Warning: array_sum() expects parameter 1 to be array, null given in D:\Program Files (x86)\xampp\htdocs\ogl\include\dodaj2.php on line 37

czyli
  1. if(array_sum($_FILES['plik']['error'])==0)


Cytat
Notice: Undefined index: plik in D:\Program Files (x86)\xampp\htdocs\ogl\include\dodaj2.php on line 39
Za duzo

czyli
  1. $l = count($_FILES['plik']['tmp_name']);


A całość kodu:
  1. <?PHP
  2. function form2()
  3. {
  4. echo '<form action="index.php?page=dodaj2" method="post">';
  5. echo '<div class="konto_box"><div class="konto_box_text"><img src="images/photos.png"/> Zdjęcia</div></div>';
  6. echo '<div class="konto_box_link">';
  7. echo '<input type="file" name="plik[]" multiple="multiple"/><br><br>
  8. <font size=2>Aby wybrać kilka plików przytrzymaj CTRL i zaznacz zdjęcia.<br>Maksymalnie 5 plików po 1MB każdy.</font>';
  9. echo '</div>';
  10. echo '<div style="margin-top:20px"></div>';
  11. echo '<div class="konto_box"><div class="konto_box_text"><img src="images/contact.png"/> Kontakt</div></div>';
  12. echo '<div class="konto_box_link">';
  13. echo 'Telefon <input type="text" name="telefon" class="ustawienia_form"><br>';
  14. echo 'E-mail <input type="text" name="mail" class="ustawienia_form">';
  15. echo '</div>';
  16. echo '<br><br><input type="submit" name="wyslano2" value="Dodaj ogłoszenie" class="dodaj_submit"></form>';
  17. }
  18. if($_SESSION["ok"]==true)
  19. {
  20. if ($_SERVER['HTTP_REFERER'] == 'http://127.0.0.1/ogl/index.php?page=dodaj' OR 'http://127.0.0.1/ogl/index.php?page=dodaj2')
  21. {
  22. if(isset($_POST["wyslano2"]))
  23. {
  24. $telefon = $_POST["telefon"];
  25. $mail = $_POST["mail"];
  26.  
  27. if(preg_match("/^[0-9\-\(\)]+$/", $telefon) == 1)
  28. {
  29. if(preg_match('/^[a-zA-Z0-9\.\-_]+\@[a-zA-Z0-9\.\-_]+\.[a-z]{2,4}$/D', $mail))
  30. {
  31. if(array_sum($_FILES['plik']['error'])==0)
  32. {
  33. $l = count($_FILES['plik']['tmp_name']);
  34. if($l>0 && $l<=3)
  35. {
  36. for($i=0; $i < 3; $i++)
  37. {
  38. if(@is_uploaded_file($_FILES['plik']['tmp_name'][$i]))
  39. {
  40. list($oldWidth, $oldHeight) = getimagesize($_FILES['plik']['tmp_name'][$i]);
  41. $l1 = rand(1,9);$l2 = rand(1,9);$l3 = rand(1,9);$l4 = rand(1,9);$l5 = rand(1,9);
  42. $l6 = rand(1,9);$l7 = rand(1,9);$l8 = rand(1,9);$l9 = rand(1,9);$l10 = rand(1,9);
  43. $l11 = rand(1,9);$l12 = rand(1,9);$l13 = rand(1,9);$l14 = rand(1,9);$l15 = rand(1,9);
  44. $nazwa = $l1.$l2.$l3.$l4.$l5.$l6.$l7.$l8.$l9.$l10.$l11.$l12.$l13.$l14.$l15;
  45. if($_FILES['plik']['size'][$i]<='1048576')
  46. {
  47. $allowed = array('image/pjpeg', 'image/jpeg', 'image/JPG', 'image/X-PNG', 'image/PNG', 'image/png', 'image/x-png');
  48. if(in_array($_FILES['plik']['type'][$i], $allowed))
  49. {
  50. if($oldHeight<='500')
  51. {
  52. move_uploaded_file($_FILES['plik']['tmp_name'][$i], "img/a_$nazwa.jpg");
  53. echo 'Plik: <strong>"'.$_FILES['plik']['name'][$i].'"</strong>został przesłany na serwer!<br>';
  54. }
  55. else
  56. {
  57. $skala = 500/$oldHeight;
  58. $newWidth = round($oldWidth*$skala);
  59. $maly = ImageCreateTrueColor($newWidth, 500);
  60. $duzy = ImageCreateFromJPEG($_FILES['plik']['tmp_name'][$i]);
  61. ImageCopyResampled($maly,$duzy,0,0,0,0,$newWidth,500,$oldWidth,$oldHeight);
  62. ImageJPEG($maly, "img/a_$nazwa.jpg", 100);
  63. echo 'Plik: <strong>"'.$_FILES['plik']['name'][$i].'"</strong>został przesłany na serwer!<br>';
  64. }
  65. }
  66. else
  67. {
  68. echo 'Plik "'.$_FILES['plik']['name'][$i].'" ma niewłaściwy format.<br>';
  69. }
  70. }
  71. else
  72. {
  73. echo 'Plik "'.$_FILES['plik']['name'][$i].'" waży za dużo.<br>';
  74. }
  75. }
  76. }
  77. }
  78. else
  79. {
  80. echo "Za duzo";
  81. }
  82. }
  83. else
  84. {
  85. echo('Wybierz plik!');
  86. }
  87. }
  88. else
  89. {
  90. echo '<font style="color:red;font-weight:bold">Podany adres e-mail jest niewłaściwego formatu.</font><br><br>';
  91. form2();
  92. }
  93. }
  94. else
  95. {
  96. echo '<font style="color:red;font-weight:bold">Podany nr telefonu zawiera niedozwolone znaki.
  97. <br>Dopuszczalne znaki to: liczby z zakresu 0-9, myślnik oraz nawias.</font><br><br>';
  98. form2();
  99. }
  100. }
  101. else
  102. {
  103. form2();
  104. }
  105. }
  106. else
  107. {
  108. header("Location: index.php");
  109. }
  110. }
  111. else
  112. {
  113. header("Location: index.php");
  114. }
  115.  
  116. ?>
aras785
Zapomniałeś dodać w formularzu:
  1. enctype="multipart/form-data"


Czyli:

  1. <form action="index.php?page=dodaj2" method="post" enctype="multipart/form-data">
smile.gif
Turson
Już sam rozkminiłem.
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.