Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Upload
Forum PHP.pl > Forum > PHP
PawelC
Witam mam pytanie, mam kod na upload plików, ale problem polega na tym że wrzuca mi pliki ze wszystkimi rozszerzeniami. I moje pytanie jest takie, jak ograniczyć upload plików tylko do plików z rozszerzeniem gif, jpg
qqrq
Przed wywołaniem funkcji move_uploaded_file() sprawdzasz nazwę pliku (bodajże $_FILES['plik']['name']). Jeżeli zależy ci na bezpieczniejszym sprawdzaniu (wiadomo - rozszerzenie zawsze można zmienić), wgraj sobię paczkę PECL-a FILEINFO i tym sprawdzaj.
PawelC
Mam teraz taki kod:
Kod
<?php
$uploaddir='c:/';
if($_FILES['plik1']['error']== UPLOAD_ERR_OK){
$new_name=$uploaddir.$_FILES['plik1']['name'];
$temp_name=$_FILES['plik1']['tmp_name'];
if(move_uploaded_file($temp_name,$new_name)){
echo "plik ok.\n";
}else{ print "blad\n";
}
}

?>

I działa poprawnie, ale nie wiem nadal jak ograniczyć do danego rozszerzenia
Cysiaczek
heheheh. Masz chyba dobry dzień ;p Akurat walczyłem z filtrami ;p
1.
  1. <?php
  2. abstract class imageFilterIterator extends FilterIterator
  3. {
  4. protected $accepted=array(
  5. ".jpg",
  6. ".png",
  7. ".gif",
  8. ".bmp"
  9. );
  10. }
  11. ?>


2,
  1. <?php
  2. class imageUploadFilter extends imageFilterIterator
  3. {
  4. protected $refused=array();
  5.  
  6. public function accept()
  7. {
  8. $file=$this->current();
  9. if(in_array(strrchr($file['name'], '.'), $this->accepted))
  10. {
  11. return true;
  12. }
  13. else
  14. {
  15. $this->refused[]=$file;
  16. return false;
  17. }
  18. }
  19.  
  20. function getRefused()
  21. {
  22. return $this->refused;
  23. }
  24.  
  25. function hasRefused()
  26. {
  27. if(count($this->getRefused())>0)
  28. {
  29. return true;
  30. }
  31. return false;
  32. }
  33. }
  34. ?>


Jak używać?
  1. <?php
  2. $filesToUpload=new imageUploadFilter(new ArrayIterator($_FILES));
  3. // i teraz już normalnie
  4. foreach($filesToUpload as $file)
  5. {
  6. //move_uploaded_file()
  7. }
  8. ?>

Pozdrawiam.
PawelC
umieściłem ten kod co mi napisałeś w pliku skrypt2.php i po wybraniu pliku przechodzi do pliku skrypt2.php i wyskakuje mi
Cytat
Parse error: parse error in c:\usr\krasnal\www\cms\skrypt2.php on line 3

A ta linia to:
Kod
abstract class imageFilterIterator extends FilterIterator


Hehe nieźle nie dość że dostałem gotowca to jeszcze niewiem jak go użyć.
Cysiaczek
Niemożliwe, zeby to to powodowało błąd (chyba, ze masz php4) sprawdź inne linijki.

Pozdrawiam.
PawelC
Ok teraz działa, miałem w krasnalu na localhoscie ustawiony php4
tehn
a może coś takiego:

  1. <?php
  2. if (!in_array($_FILES['plik1']['type'], array (
  3. 'image/jpeg',
  4. 'image/pjpeg'
  5. ))){
  6. echo 'Tylko jpg...';
  7. exit();
  8. }
  9. ?>


to tylko przykład na jpg... dla gifa będzie pewnie podobnie...
marcio
a moze zamiast kombinowac to lepiej zrobic explode i zobaczyc czy ciag po kropce jest rowny
jpg
gif
png
ect......
questionmark.gifquestionmark.gifquestionmark.gif
PawelC
Hmm łatwo powiedzieć gorzej to wszystko połączyć w jedno. Ale dzięki za wskazówke.
marcio
czemu ja php znam nie zadobrze ale tak to powinno wygladac przed move_uploaded_file()
  1. <?php
  2. $folder = '/odebrane/'.$_FILE['plik1']['tmp_name'];
  3. $explode = explode('.', $_FILES['plik1']['name']);
  4. if($explode[1] == 'jpg' || $explode[1] == 'gif' || $explode[1] == 'png') { 
  5. move_uploaded_file($_FILE['plik1']['tmp_name'], $folder);
  6. //i tu mozesz dac echo czy cos
  7. }
  8. ?>
PawelC
O lol ja w php bawię się od prawie 3 lat a na to niewpadłem.
marcio
a ja sie bawie nie caly rok biggrin.gif i jak latwe nie a nie kombinowac na klasach przy tych -> to mozna nerwicy dostac
PawelC
To fakt, ale tak już jest najłatwiejszy sposób na wszystko znajduje się dopiero wtedy kiedy wykonamy coś w najtrudniejszym z możliwych. Prawda jest taka że nie wszystkie rzeczy potrzebowałem, i dlatego niektórych prostych rzeczy niewiem, a gdy już je potrzebuje to niewiem od czego zacząć biggrin.gif Dobra koniec tego offtopa biggrin.gif Co do tych klass itp to masz racje, idzie szybko ześwirować
marcio
sorki byla literowka teraz jest dobrze poprawilem
Cysiaczek
No panowie! Nie przsadzajcie. Akurat rozwiązanie, które podałem należy chyba do najlegantszych z możliwych i do tego zgodnych z OOP, z wykorzystaniem SPL... no kurde ; p

Zastępujemy to: (od ~marcia)
  1. <?php
  2. $folder = '/odebrane/'.$_FILE['plik1']['tmp_name'];
  3. $explode = explode('.', $_FILES['plik1']['name']);
  4. if($explode[1] == 'jpg' || $explode[1] == 'gif' || $explode[1] == 'png') { 
  5. move_uploaded_file($_FILE['plik1']['tmp_name'], $folder);
  6. //i tu mozesz dac echo czy cos
  7. }
  8. ?>


Tym.
  1. <?php
  2. $files=new imageUploadFilter(new ArrayIterator($_FILES));
  3. foreach($files as $file)
  4. {
  5. $folder='/odebrane/'.$file['tmp_name'];
  6. move_uploaded_file($file['tmp_name'], $folder);
  7. }
  8. ?>


Po co jakieś explode?
Ciekawe, co byś zrobił ~marcio z plikiem myFile.class.php. albo z to.jest.nazwa.pliku.png
Przyznam, że jakbym miał robić Waszymi sposobami, to by mnie chyba szlag trafił na miejscu :|

Pozdrawiam.

P.S
Rozpoznawanie typu mime mozecie sobie zrobić też łatwo, ale to już zostawiam wyobraźni ewentualnego użytkownika tego kodu. ;p
PawelC
Cytat
Przyznam, że jakbym miał robić Waszymi sposobami, to by mnie chyba szlag trafił na miejscu :|

to teraz już wiesz dlaczego z dnia na dzień co raz to bardziej mi się żyć odechciewa biggrin.gif
Cytat
Rozpoznawanie typu mime mozecie sobie zrobić też łatwo, ale to już zostawiam wyobraźni ewentualnego użytkownika tego kodu. ;p

Heheh czyli mam kolejne zajęcie winksmiley.jpg

fakt Cysiaczek Twoje rozwiązanie działa na serwie z php5 a co z 4?
Cysiaczek
Na 4 nie może działać i bardzo dobrze, że tak jest - tworząc jakiś nowy kod od podstaw nie bierze się wogóle pod uwagę tej wersji jezyka. Za kilka miesięcy php 6 ...

Pozdrawiam.

5 minut pracy:
  1. <?php
  2. abstract class imageFilterIterator extends FilterIterator
  3. {
  4. protected $acceptedExtensions=array(
  5. ".jpg",
  6. ".png",
  7. ".gif",
  8. ".bmp"
  9. );
  10.  
  11. protected $acceptedMimes=array(
  12. "image/jpg",
  13. "image/jpeg",
  14. "image/gif",
  15. "image/png",
  16. "image/bmp"
  17. );
  18. }
  19. ?>


  1. <?php
  2. class imageUploadFilter extends imageFilterIterator
  3. {
  4. protected $refused=array();
  5.  
  6. public function accept()
  7. {
  8. $file=$this->current();
  9. if(in_array(strrchr($file['name'], '.'), $this->acceptedExtensions) && in_array($file['type'], $this->acceptedMimes))
  10. {
  11. return true;
  12. }
  13. else
  14. {
  15. $this->refused[]=$file;
  16. return false;
  17. }
  18. }
  19.  
  20. function getRefused()
  21. {
  22. return $this->refused;
  23. }
  24.  
  25. function hasRefused()
  26. {
  27. if(count($this->getRefused())>0)
  28. {
  29. return true;
  30. }
  31. return false;
  32. }
  33. }
  34. ?>


Wartość tego rozwiązanie jest jednak niewielka, bo mime i tak nie jest poprawnie ropoznawane. Trzeba by zbadac plik już po uploadzie.

Pozdrawiam,
PawelC
Fakt wartość tego rozwiązania może jest niewielka ale to zawsze coś winksmiley.jpg czyli rozumiem że ten kod i te poprzednie mam wrzucić np do pliku upload.php który jest wykonywany po wybraniu pliku w formularzu. Aha i wielkie dzięki za pomoc przy tym.
marcio
Cysiaczek nie watpie w to ze php znasz lepiej odemnie ale jakos nie przepadam za OOP dlatego zrobilem z explode biggrin.gif
Cysiaczek
Robisz sobie jeden plik = jedna klasa i dołaczasz biblioteki w upload.php - ponieżej cała zawartośc tego pliku - nic więcej nie trzeba (no jakiś komunikat by się przydał ; p )

  1. <?php
  2. include_once("imageFilterIterator.class.php");
  3. include_once("imageUploadFilter.class.php");
  4.  
  5. $files=new imageUploadFilter(new ArrayIterator($_FILES));
  6. foreach($files as $file)
  7. {
  8. $folder='/odebrane/'.$file['tmp_name'];
  9. move_uploaded_file($file['tmp_name'], $folder);
  10. }
  11. ?>


@marcio - ale i tak ono nie działa poprawnie - ma poważnego buga ; p
btw, OOP po prostu trzeba się dzisiaj uczyć, bo to jest standard - bez tego nie dostaniesz żadnej sensowej pracy.

Pozdrawiam.
drPayton
A tak btw: rozwiązanie które podał @marcio jest funta kłaków niewarte. Złoży się jeśli w nazwie pliku wystąpi kropka. Jeśli już, to nie:
  1. <?php
  2. $explode = explode('.', $_FILES['plik1']['name']);
  3. (...)
  4. $explode[1] (...)
  5. ?>

tylko:
  1. <?php
  2. $explode = explode('.', $_FILES['plik1']['name']);
  3. (...)
  4. $explode[sizeof($explode)-1] (...)
  5. ?>

Czy inaczej, byle ostatni element...

edit:
@Cysiaczek: to miałeś na myśli? winksmiley.jpg

added: Znajomość OOP jest wymagana od profesjonalisty, ale nawet duże aplikacje mogą być proceduralne (vide phpMyAdmin)...
Tu jak wiadomo trwa wieczny i wciąż nierozstrzygnięty spór smile.gif
Cysiaczek
@drPayton - ale po co kombinować z sizeof? Jest strrchr" title="Zobacz w manualu PHP" target="_manual, które zwraca cały ciąg znaków OD momentu ostatniego wystąpienia żądanego znakum czyli w pliku to.jest.nazwa.pliku.jpeg
Zakładamy oczywiście, że poprawny plik graficzny powinien mieć jakieś rozszerzenie. Jeśli nie, to pozostaje mime.
  1. <?php
  2. print strrchr('to.jest.nazwa.pliku.jpeg', '.');
  3. // .jpeg
  4. ?>


Potem najwyżej można sobie odciąć kropkę ; p

Pozdrawiam.
marcio
ja wiem z jesli jest kropka to kicha skrypt sie rozwali ale to bylo najlatwiejsze co mozna zrobic wiec podalem a w php geniuszem nie jestem ale to co podal drPraton jest dobre o tym nie pomyslalem zeby policzyc na ile czesci policzy ciag i wyciagnac ostatni po ostatnoej kropce widac ze jeszcze nie mysle programistycznie

a tak btw o jakiego buga chodzi o tego co podal djpraton?
drPayton
djpraton? Podoba mi się, chyba zmienię biggrin.gif
Faktycznie, zamiast bawić się countem lepiej strrchr, tak jak napisał @Cysiaczek (dlatego zaznaczyłem "Czy inaczej, byle ostatni element...") winksmiley.jpg
@marcio Na Twoje pytanie odpowiedzieć musi oczywiście Cysiaczek natomiast powiem Ci, że takie podejście (obiektowe) ma jedną zasadniczą zaletę: łatwość dokonywania zmian i czytelność kodu.

edit: drPraton też mi się podoba tongue.gif
marcio
drPAYTON sorki ze 2 razy pomylilem twoj nikc smile.gif
Ok teraz czekam na odpowiedz Cyciaszek.
Ale ja mam problemy z OOP wiec wole pisac proceduralnie biggrin.gif ale szkoda.A tak apropo to nie wiedzialem ze jest taka funckja jak strchr() ale wszystkoego wiedziec nie mozna jak dla mnie rozwiazanie z explode ale te twoje jest najbardziej optymalne tylko nie wiem jakiego ma buga tongue.gif
Cysiaczek
Właśnie tego zwiąanego z ilością kropek w nazwie pliku.
marcio
ok dzieki za odpwiedz ale czy taki blad moze wykorzystac ktos kto upload'uej plik z wieksza iloscia kropek??
Ale czy rozwiazanie drPAYTON jest dobre??
Mi sie wydaje ze jest dobre i bezpieczne i chodzi bez problemow
drPayton
Ale co to znaczy wykorzystać? Tutaj po prostu właściwego pliku obrazka (z kropką w nazwie) nie dałoby się wgrać. Raz jeszcze - podejście obiektowe jest znacznie wygodniejsze i warto się w to zagłębić,a w międzyczasie stosować Twoje rozwiązanie z tą jedną zmianą o której napisaliśmy. Oczywiście dodatkowo trzeba by jeszcze jakieś ify na wypadek gdyby jakiś błąd wystąpił etc, ale schemat jest ok.
Ucz się OOP winksmiley.jpg To konieczność...
marcio
ok poucze sie ale chodzilo mi o to ze cyciaszek napisal ze to jest bug wiec myslalem ze mozna to jakos wykorzystac jakby to nazwal blad to bym nie pytal ale wszystko ok biggrin.gif
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.