Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Upload kilku zdjęć + generowanie miniaturkami
Forum PHP.pl > Forum > PHP
Butcher
Witam serdecznie

Napisałem skrypt, który pozwala na upload pliku (np, zdjęcia) wraz z automatycznym tworzeniem miniaturek. Pozwala także na zmiane nazw plików (ale to już nie jest istotne). Skrypt świetnie radzi sobie z jednym plikiem, lecz gdy chce uploadować więcej zdjęć jest już problem.

Co chciałbym osiągnąć?

Założenie skryptu:
#1 upload 4 zdjęć na raz
#2 automatyczne generowanie miniaturek dla każdego zdjęcia
#3 zapamiętanie ścieżek uploadowanych plików (tak by później móc je zapisać w bazie danych)
#4 Sprawdzenie czy uploadowane pliki już istnieje

To chyba wszystko co bym chciał zrobić sad.gif

Oto formularz:
Kod
<form enctype="multipart/form-data" method="post" action="upload.php">
 <input type="file" name="plik" /><br />
 <input type="text" name="nowanazwa" /><br />
 <input type="submit" value="Zaladuj" />
</form>


a to skrypt wykonujący zadanie:
  1. <?php
  2.  
  3. if(!in_array($_FILES['plik']['type'], array('image/pjpeg')))
  4. {
  5.     print("Nieprawidlowy format pliku");
  6. }
  7. else
  8. {
  9.     if(empty($_POST['nowanazwa']))
  10.     {
  11.         print("Wypelnij brakujace pole");
  12.     }
  13.     else
  14.     {
  15.         $katalog="pliki/";
  16.  
  17.         if(file_exists("$katalog$nowanazwa") && file_exists("$katalog$nowanazwa$m"))
  18.         {
  19.             print "Ten plik juz istnieje";
  20.         }
  21.         else 
  22.         {
  23.             $m = "_m";
  24.             list($szerokosc, $wysokosc) = getimagesize($plik);
  25.             $miniaturka = imagecreatetruecolor(133, 100);
  26.             $zrodlowy = imagecreatefromjpeg($plik);
  27.             imagecopyresized($miniaturka, $zrodlowy, 0, 0, 0, 0, 133, 100, $szerokosc, $wysokosc);
  28.             imagejpeg($miniaturka,"$miniaturka");
  29.             rename("$miniaturka", "$katalog"."$nowanazwa"."$m");
  30.             
  31.             if($plik_name!="") 
  32.             {
  33.                 copy("$plik","$katalog$plik_name");
  34.                 rename("$katalog$plik_name", "$katalog$nowanazwa"); 
  35.             }
  36.             else
  37.             {
  38.                     print("Plik nie istnieje");
  39.             }
  40.         }
  41.     }
  42. }
  43.  
  44. ?>


Proszę o pomoc ohmy.gif


Pozdrawiam
FiDO
Chyba troszke dzialy pomyliles.. przenosze.

A co do problemu to nic dziwnego, ze dziala tylko z jednym, skoro nie masz zadnej petli ani nic.. Proponuje na poczatek zrobic sobie w tym kodzie prostego debuga "var_dump( $_FILES );". To powinno Ci troche rozjasnic sytuacje jaka i ulatwic napisanie petli.
Butcher
No właśnie to, że pętle trzeba zrobić to wiem i nawet mam juz taką pętle zrobioną tylko jak to ze soba łączę to nie działa sad.gif

  1. <?
  2. while(list($a,$b) = each($_FILES[plik][name]))
  3. {
  4. if(!empty($b))
  5. {
  6. $nazwapliku = $b;
  7. $dodaj = "$nazwapliku";
  8. copy($_FILES[plik][tmp_name][$a], $dodaj);
  9. }
  10. }
  11. ?>


Sama pętla działa znakomicie, choć jest prosta winksmiley.jpg
Ale już jak ją nadpiszę z kodem z poprzedniego posta to nie dziala sad.gif

Nadal proszę o pomoc rolleyes.gif

Pozdrawiam
FiDO
Pokaz jaki masz kod html dla tego formularza.
Butcher
Oto kod do tego formularza:

  1. <?
  2. echo "<form method=post action=upload.php enctype='multipart/form-data'>";
  3. for($i=1; $i<=4; $i++)
  4. {
  5. echo "<input type='file' name='plik[]'>";
  6. }
  7. echo "<input type='submit' value='Dodaj'>"; 
  8. echo "</form>";
  9. ?>


Przeczuwam, że znalazłeś lekarstwo na moją chorobe winksmiley.jpg

Dziękuje za zainteresowanie i Pozdrawiam
FiDO
Wyglada ok..

Aha.. ten sposob iteracji po petlach (while-each) jest najmniej wydajnym sposobem.. radze sie go za wczasu oduczyc.

Sprobuj tak:

  1. <?php
  2.  
  3. foreach ($_FILES["plik"]["name"] as $key => $name) {
  4.    move_uploaded_file($_FILES["plik"]["tmp_name"][$key], "sciezka/". $name);
  5. }
  6.  
  7. ?>


W Twoim kodzie nie widze sciezki.. czyzbys jej zapomnial dokleic ?
Jesli nadal nie bedzie dzialac to pokaz to co w pierwszym poscie tylko, ze w wersji z petla, moze zle cos laczysz.
Butcher
Tak zauważyłem ten błąd winksmiley.jpg

Nie podałem ścieżki ponieważ testowałem to wszystko w jednym folderze, więc zdjęcia uploadowane były w tym samym katalogu, w którym znajdował się skrypt.

Teraz dzięki Tobie zacznę używać nowszej wersji pętli winksmiley.jpg

Hmm.. no ale nadal mi nie działa tak jak powinno sad.gif

Mogę prosić o gotowca? rolleyes.gif
FiDO
Cytat
Hmm.. no ale nadal mi nie działa tak jak powinno  sad.gif

No to pokaz kod (caly tak jak go zlozyles z ta petla), z fusow przyczyny nie wywroze.

Cytat
Mogę prosić o gotowca?  rolleyes.gif

Oczywiscie.. ze nie ;]
Butcher
O mysłałem, że jutro dopiero odpowiesz winksmiley.jpg

Zaraz dołączę kod, który zrobiłem ale najpierw musze coś zjeść bo już jest późno i zgłodniałem aarambo.gif

Na wirtualnym serwerze (KRASNAL2.7), który postawiłem u siebie na kompie wszystko działa bardzo dobrze. Problem w tym, że gdy przekopiuje pliki na server w HOME.PL wyskakuje mi błąd:

Warning: imagecopyresized(): supplied argument is not a valid Image resource in /upload/upload.php

Czy mam przez to rozumieć, że ta opcja jest niedostępna na serwerze HOME.PL ohmy.gif

No i tu poległem bo nie wiem co zrobić dalej, a próbowałem już różnych kombinacji i za każdym razem było to samo: skrypt generował miniaturki ale były one całe czarne sad.gif

To fragment kodu, który jest odpowiedzialny za tworzenie miniaturek:

  1. <?php
  2. foreach ($_FILES["plik"]["name"] as $key => $name) 
  3. {
  4. $m = "m_";
  5. list($szerokosc, $wysokosc) = getimagesize($_FILES["plik"]["tmp_name"][$key]);
  6. $miniaturka = imagecreatetruecolor(133, 100);
  7. $zrodlowy = imagecreatefromjpeg($_FILES["plik"]["tmp_name"][$key]);
  8. imagecopyresized($miniaturka, $zrodlowy, 0, 0, 0, 0, 133, 100, $szerokosc, $wysokosc);
  9. imagejpeg($miniaturka,"$miniaturka");
  10. rename("$miniaturka", "folder/"."$m"."$name");
  11. }
  12. ?>


Padam juz na klawiature, wkońcu 5 rano już jest, ale chyba dobrze wkopiowałem kod. sleepysmiley03.gif

Domyślam się, że może tu być jakiś błąd (ale nie jestem w 100% pewny, ponieważ na wirtualnym na moim komputerze działa wszystko OK). Rkingsmiley.png

Jak to można poprawić by działało sadsmiley02.gif

Pozdrawiam
FiDO
Sadzac po tresci bledu ktorys z obrazkow $miniaturka lub $zrodlowy jest nieprawidlowym obrazkiem, tj. nie udalo sie jego stworzenie. $miniaturka to tworzony pusty obrazek, wiec tutaj raczej nie ma prawa byc bledu. Stawialbym raczej na ten drugi, ktory jest wczytywany z uploadowanego pliku. Na pierwszy rzut oka nie widze jakiejs konkretnej przyczyny, wiec na Twoim miejscu zaczalbym od wyswietlenia tej nazwy pliku (np. za pomoca echo) przed jego wczytaniem i upewnieniu sie, ze jest to poprawna sciezka.
Butcher
Witam Cię FiDO

Musze powiedzieć, że przetestowałem ten skrypt także na serwerze NAZWA.PL i tu wszystko działa poprawnie. Nie ma wygenerowanego żadnego komunikatu przez wyszukiwarke o błędzie w kodzie, a zdjęcia są uplodowane poprawnie na serwer wraz z ich resizem.

Powiedz mi co mam robić, bo widze, że bardzo dobrze znasz się na programowaniu winksmiley.jpg

Pozdrawiam
FiDO
No to skoro nie dziala tylko na home to wypadalo by tam to testowac, zeby znalezc przyczyne. Napisalem w poprzednim poscie co powinienes zrobic w pierwszej kolejnosci. Wyswietlaj nazwe pliku zanim przekazesz ja do imagecreatefromjpeg i sprawdz czy sie zgadza. Mozesz tez sprobowac najpierw przekopiowac plik z katalogu tymczasowego do "siebie" i dopiero z tamtad go wczytywac.. nie powinno miec to znaczenia, ale czasem roznie to bywa.

Cytat
Powiedz mi co mam robić, bo widze, że bardzo dobrze znasz się na programowaniu  winksmiley.jpg

Bo Ci piasku do wazeliny dosypie tongue.gif
Butcher
Cytat
Bo Ci piasku do wazeliny dosypie  tongue.gif

Piasek nawet zdrowy jest rolleyes.gif

No już wszytsko dobrze zrobiłem. Okazuje się, że serwer HOME.PL nie radzi sobie najlepiej z tworzeniem miniaturek... dlatego też wyskakuje tam błąd winksmiley.jpg

Dziękuje serdecznie za pomoc FiDO i już nie smaruje tongue.gif

Pozdrawiam
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.