Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [HTML][PHP]Dodawanie zdjęcia, tworzenie miniatury
Forum PHP.pl > Forum > Przedszkole
arekko
Dzień dobry, stworzyłem formularz z którego za pomocą kontrolera pobieram wybrane zdjęcie, sprawdzam warunki czy wszystko jest ok, dodaje zdjęcie na serwer i w innym pliku towrzę miniaturkę.
Oto szablon:

  1. <form action="?addproductform" method="post" enctype="multipart/form-data" >
  2. <p><input type="file" name="upload_image[]" /></p>
  3. <input type="submit" name="upload_submit" value="Dodaj" id="dodaj"/>


oraz kontroler:
  1. <?php
  2.  
  3. if(isset($_GET['addproductform']))
  4. {
  5. $pageTitle = 'Dodawanie realizacji';
  6.  
  7. $config = array();
  8. $config['thumbnail_width'] = 400; // maksymalna szerokość miniatury w pikselach
  9. $config['thumbnail_height'] = 400; // maksymalna wysokość miniatury w pikselach
  10. $config['thumbnail_scale'] = true; // czy przy minimalizowaniu wielkości zachowywać skalę?
  11. $config['path_images'] = '../../grafika/realizacje/obrazki/'; // ścieżka do katalogu grafik
  12. $config['path_thumbnails'] = '../../grafika/realizacje/miniaturki/'; // Ścieżka do katalogu miniatur
  13. $config['max_file_size'] = 2097152; // maksymalna wielkość pliku w bajtach, 2MB
  14. $config['accepted_extensions'] = array('jpg', 'jpeg', 'png', 'gif'); // dozwolone rozszerzenia
  15. $config['accepted_mimes'] = array('image/jpg', 'image/jpeg', 'image/png', 'image/gif'); // dozwolone typy MIME
  16.  
  17. if ( !file_exists($config['path_images']) || !is_dir($config['path_images']) ) {
  18. if ( !mkdir($config['path_images']) ) { // utworzenie katalogu wraz
  19. exit('Folder obrazków nie możliwy do utowrzenia!');
  20. }
  21. chmod($config['path_images'], 0777); // nadanie praw
  22. }
  23. if ( !file_exists($config['path_thumbnails']) || !is_dir($config['path_thumbnails']) ) {
  24. if ( !mkdir($config['path_thumbnails']) ) { // utworzenie katalogu
  25. exit('Folder miniaturek niemożliwy do utworzenia!');
  26. }
  27. chmod($config['path_thumbnails'], 0777); // nadanie praw
  28. }
  29.  
  30. if ( !extension_loaded('gd') ) { // sprawdzenie, czy GD jest załadowane
  31. if ( !dl('gd') ) { // próba wymuszenia załadowania
  32. exit('Biblioteka GD nie została załadowana!');
  33. }
  34. }
  35.  
  36. if ( isset($_FILES['upload_image']) && isset($_POST['upload_submit']) )
  37. {
  38. // pętla analizująca zawartość wszystkich trzech potencjalnie wysyłanych plików
  39. foreach ( $_FILES['upload_image']['error'] as $key => $arr )
  40. {
  41. if ( $_FILES['upload_image']['error'][$key] != UPLOAD_ERR_OK )
  42. {
  43. continue;
  44. }
  45. if ( $_FILES['upload_image']['size'][$key] > $config['max_file_size'] )
  46. {
  47. $error = "Plik jest za duży. ";
  48. $imageerror = ' Wybrany przez Ciebie plik:' . $_FILES['upload_image']['name'][$key];
  49. continue;
  50. }
  51. if ( file_exists($config['path_images'] . $_FILES['upload_image']['name'][$key]) )
  52. {
  53. $error = "Plik o takiej nazwie już istanieje. ";
  54. $imageerror = ' Wybrany przez Ciebie plik:' . $_FILES['upload_image']['name'][$key];
  55. continue;
  56. }
  57. $extension = explode('.', $_FILES['upload_image']['name'][$key]);
  58. if ( in_array(strtolower($extension[count($extension)-1]), $config['accepted_extensions']) === false || in_array($_FILES['upload_image']['type'][$key], $config['accepted_mimes']) === false )
  59. {
  60. $error = "Niepoprawne rozszerzenie pliku.";
  61. continue;
  62. }
  63. $image = getimagesize($_FILES['upload_image']['tmp_name'][$key]);
  64. if ( !is_array($image) || $image[0] < 1 )
  65. {
  66. $error = "Plik graficzny jest spreparowany.";
  67. continue;
  68. }
  69. if ( !is_uploaded_file($_FILES['upload_image']['tmp_name'][$key]) )
  70. {
  71. $error = "Plik nie został wysłany.";
  72. continue;
  73. }
  74. if ( !move_uploaded_file($_FILES['upload_image']['tmp_name'][$key], $config['path_images'] . $_FILES['upload_image']['name'][$key]) )
  75. {
  76. $error = "Wysyłanie nie może zostać zakończone.";
  77. continue;
  78. }
  79. // opcjonalnie, jeşeli chcemy tylko z poziomu skrypt mieć dostęp do plików moşemy odkomentować ponişsza linijkę
  80. // chmod($config['path_images'] . $_FILES['upload_image']['name'][$key], 0600);
  81. print generateThumbnail($_FILES['upload_image']['name'][$key], $extension[count($extension)-1]); // funkcja tworząca miniaturkę
  82. }
  83. }
  84.  
  85. function generateThumbnail($filename, $extension)
  86. {
  87.  
  88. // sprawdzenie, czy plik o podanej nazwie już nie istnieje
  89. if ( file_exists($config['path_thumbnails'] . $filename) )
  90. {
  91. unlink($config['path_thumbnails'] . $filename); // usunięcie miniatury
  92. }
  93. // stworzenie nowej grafiki wg typu
  94. switch ( $extension )
  95. {
  96. case 'gif':
  97. $ic = imagecreatefromgif($config['path_images'] . $filename);
  98. break;
  99. case 'png':
  100. $ic = imagecreatefrompng($config['path_images'] . $filename);
  101. break;
  102. default:
  103. $ic = imagecreatefromjpeg($config['path_images'] . $filename);
  104. break;
  105. }
  106. if ( $ic === false )
  107. {
  108. return 'Miniaturka nie stworzona!';
  109. echo "Miniaturka nie stworzona!";
  110. }
  111. $is = getimagesize($config['path_images'] . $filename); // [0] - szerokość, [1] - wysokość
  112. switch ( $config['thumbnail_scale'] )
  113.  
  114. {
  115. case false: // zmniejszanie bezpośrednio do 180x160px
  116. $nts = imagecreatetruecolor($config['thumbnail_width'], $config['thumbnail_height']);
  117. imagecopyresized($nts, $ic, 0, 0, 0, 0, $config['thumbnail_width'], $config['thumbnail_height'], $is[0], $is[1]);
  118. break;
  119. default: // zmniejszanie z zachowaniem skali, aż do osiągnięcia co najmniej 180x160px
  120. $width = $is[0];
  121. $height = $is[1];
  122. $ratio = $is[0] / $config['thumbnail_width'];
  123. if ( $ratio > 1 )
  124. {
  125. $width = $config['thumbnail_width'];
  126. $height = intval($is[1] / $ratio);
  127. }
  128. $ratio = $height / $config['thumbnail_height'];
  129. if ( $ratio > 1 )
  130. {
  131. $width = intval($width / $ratio);
  132. $height = $config['thumbnail_height'];
  133. }
  134. $nts = imagecreatetruecolor($width, $height); // utworzenie obrazka o podanych rozmiarach z czarnym tłem
  135. imagecopyresized($nts, $ic, 0, 0, 0, 0, $width, $height, $is[0], $is[1]); break;
  136. }
  137. switch ( $extension ) // zapis do pliku
  138. {
  139. case 'gif':
  140. imagegif($nts, $config['path_thumbnails'] . $filename);
  141. break;
  142. case 'png':
  143. imagepng($nts, $config['path_thumbnails'] . $filename);
  144. break;
  145. default:
  146. imagejpeg($nts, $config['path_thumbnails'] . $filename);
  147. break;
  148. }
  149. imagedestroy($nts); // zniszczenie obrazka
  150. return $config['path_thumbnails'] . $filename;
  151. }
  152.  
  153.  
  154. include 'addproductform.html.php'; //Powrót do formularza
  155. exit();
  156. }
  157. ?>


Kontroler posiada jeszcze parę innych funkcji dlatego część z dodawaniem zdjęcia umieściłem w instrukcji if. Problem jest taki, że tworzenie miniatury nie powodzi się. Po kliknięciu przycisku "Dodaj" - dodaje się samo zdjęcie, a przeglądarka pokazuje błąd "500" mianiturka nie tworzy się.
Problem ten występuje tylko gdy kod dodający zdjęcie i tworzący miniaturę umieszczę wewnątrz instrukcji if.
Gdy cały kod jest poza if wszystko działa. Proszę o pokazanie mi gdzie jest problem. Zależy mi na tym, żeby kod był wewnątrz instrukcji if.

Proszę o pomoc.
Rysh
  1. function generateThumbnail($filename, $extension) {
  2. // sprawdzenie, czy plik o podanej nazwie już nie istnieje
  3. if ( file_exists($config['path_thumbnails'] . $filename) ) {
  4. unlink($config['path_thumbnails'] . $filename); // usunięcie miniatury
  5. }
  6. // stworzenie nowej grafiki wg typu
  7. switch ( $extension ) {
  8. case 'gif':
  9. $ic = imagecreatefromgif($config['path_images'] . $filename);
  10. break;
  11. case 'png':
  12. $ic = imagecreatefrompng($config['path_images'] . $filename);
  13. break;
  14. default:
  15. $ic = imagecreatefromjpeg($config['path_images'] . $filename);
  16. break;
  17. }
  18. if ( $ic === false ) {
  19. return false;
  20. }
  21. $is = getimagesize($config['path_images'] . $filename); // [0] - szerokość, [1] - wysokość
  22.  
  23. switch ( $config['thumbnail_scale'] ) {
  24. case false: // zmniejszanie bezpośrednio do 180x160px
  25. $nts = imagecreatetruecolor($config['thumbnail_width'], $config['thumbnail_height']);
  26. imagecopyresized($nts, $ic, 0, 0, 0, 0, $config['thumbnail_width'], $config['thumbnail_height'], $is[0], $is[1]);
  27. break;
  28. default: // zmniejszanie z zachowaniem skali, aż do osiągnięcia co najmniej 180x160px
  29. $width = $is[0];
  30. $height = $is[1];
  31. $ratio = $is[0] / $config['thumbnail_width'];
  32. if ( $ratio > 1 ) {
  33. $width = $config['thumbnail_width'];
  34. $height = intval($is[1] / $ratio);
  35. }
  36. $ratio = $height / $config['thumbnail_height'];
  37. if ( $ratio > 1 ) {
  38. $width = intval($width / $ratio);
  39. $height = $config['thumbnail_height'];
  40. }
  41. $nts = imagecreatetruecolor($width, $height); // utworzenie obrazka o podanych rozmiarach z czarnym tłem
  42. imagecopyresized($nts, $ic, 0, 0, 0, 0, $width, $height, $is[0], $is[1]); break;
  43. }
  44.  
  45. switch ( $extension ) { // zapis do pliku
  46. case 'gif':
  47. imagegif($nts, $config['path_thumbnails'] . $filename);
  48. break;
  49. case 'png':
  50. imagepng($nts, $config['path_thumbnails'] . $filename);
  51. break;
  52. default:
  53. imagejpeg($nts, $config['path_thumbnails'] . $filename);
  54. break;
  55. }
  56.  
  57. imagedestroy($nts); // zniszczenie obrazka
  58.  
  59. return $config['path_thumbnails'] . $filename;
  60.  
  61. }


Musiałem sobie sformatować kod bo tego się czytać nie dało.
Skoro wykonujesz funkcję i chcesz wyświetlić jej wynik to nie dawaj w niej echo, tylko zwróć true lub false i w kontrolerze wyświetl odpowiedni komunikat.
Możesz mi powiedzieć co dokładnie dajesz jako drugi parametr funkcji?
arekko
Na razie nie chodzi o wyświetlanie komunikatów lecz o to aby kod działał i tworzyła się miniaturka.
Drugim parametrem funkcji jest rozszerzenie zdjęcia.
Rysh
Głupek ze mnie, przecież funkcja nie zna zmiennej $config. Jak byś włączył pokazywanie błędów byś widział co pluje paraser.
arekko
Niestety dodanie:
  1. global $config;


Nie pomaga - działa tylko gdy cały kod jest poza instrukcją if. Jakiś pomysł?
Rysh
Czyli mam rozumieć błędów paraser nie zgłasza?
Przenieś funkcję generateThumbnail przed moment w którym jej używasz.
arekko
Przestawienie kodu w taki sposób także nic nie pomaga:
  1. }
  2. }
  3. print generateThumbnail($_FILES['upload_image']['name'][$key], $extension[count($extension)-1]); // funkcja tworząca miniaturkę
  4. function generateThumbnail($filename, $extension)
  5. {
  6. global $config;
  7. // sprawdzenie, czy plik o podanej nazwie już nie istnieje
  8. if ( file_exists($config['path_thumbnails'] . $filename) )
  9. {
  10. unlink($config['path_thumbnails'] . $filename); // usunięcie miniatury
  11. }


Po kliknięciu dodaj wyświetla się błąd 500 w przeglądarce. Tak jakby gdzieś czegoś brakowało ..
Najbardziej dziwne jest to, że gdy kod ma działać poza instrukcją if to wszystko działa,
kod działa nawet w instrukcji if gdy nie musi tworzyć miniaturki.
Co jest nie tak z funkcją generateThumbnail?

Wychwytywanie błędów pokazuje:
Fatal error: Call to undefined function generateThumbnail() (ścieżka do pliku) on line 107

107 linijka po pewnych zmianach w kodzie to:
print generateThumbnail($_FILES['upload_image']['name'][$key], $extension[count($extension)-1]); // funkcja tworząca miniaturkę
markuz
Wywołujesz funkcje która jeszcze nie istnieje - tak nie można w PHP. Najpierw funkcja potem wywołanie.
arekko
Przeniosłem wywołanie na koniec. Działa. Dziękuję
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.