Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Jak przypisać danemu rozszerzeniu pliku dany obrazek?
Forum PHP.pl > Forum > Przedszkole
david8213
Chciałbym żeby każdy plik o danym rozszerzeniu miał przyporządkowaną ikonkę (plik jpg)
Skrypt musi wykrywać rozszerzenie i podstawiać do niego plik graficzny oraz wyświetlać na stronie.



Wyświetlanie plików i ich rozmiarów już zrobiłem. Teraz chcę dołożyć ikonki.

Kod
<?php
      $katalog = '../grafik/';
      $dirArray = array();
      $opdir = opendir("../grafik");
      while($file = readdir($opdir)){
      if ($file === '.' || $file === '.' || $file === '..' ||  $file === 'index.php') continue;
      $dirArray[] = $file;              }
      closedir($opdir);  
      sort($dirArray);
      foreach($dirArray as $file)         {
      $size = filesize($katalog.$file);
      echo '<table><tr><td width="500" bgcolor="#F5F5F5"><img align=absmiddle src="img/  txt.bmp"><a href="../grafik/'.$file.'" target=blank>'.$file.'</a></td><td width="100" bgcolor="#F5F5F5"><a><div style="margin-left: 5">';
      printf (" [%.2f kB]", $size/1024);
      echo '</a></td></tr></table>'; }
?>


Proszę o pomoc
Kod
<?PHP
$display['xlt'] = "img/xml.bmp";  
$display['xls'] = "img/xml.bmp";  
// itd...
global $display;

array_key_exists(get_extension($file), $display)
                         echo "<img align=absmiddle src=\"";  
                         echo $display[get_extension($file)];
                         echo "\"> ";  
?>
Fifi209
No dobra, ale zapomniałeś podać swój kod, w którym masz błąd i nie umiesz sobie z nim sam poradzić.
Kshyhoo
Przecież to proste. Rozpoznajesz plik po rozszerzeniu, czyli coś w stylu:
  1. if (substr($file, strlen($file) - 3, 3) == "rar") {
  2. echo "<img src='rar.png' />";
  3. }
david8213
Zrobiłem coś takiego. Da radę zrobić to krótszym sposobem?

Kod
<?php



$katalog = '../folder/';
  
      $dirArray = array();
  
      $opdir = opendir("../folder");
  
      while($file = readdir($opdir)){
  
      if ($file === '.' || $file === '.' || $file === '..' ||  $file === 'index.php') continue;
  
      $dirArray[] = $file;
  
      }
  
      closedir($opdir);  
            
      sort($dirArray);
  
      foreach($dirArray as $file){



echo '<table><tr><td width="500" bgcolor="#F5F5F5">';


if (substr($file, strlen($file) - 3, 3) == "xls") {
  echo "<img align=absmiddle src='img/xml.bmp' /> "; }


if (substr($file, strlen($file) - 3, 3) == "htm") {
  echo "<img align=absmiddle src='img/html.bmp' /> "; }


  echo '<a href="../folder/'.$file.'" target=blank>'.$file.'</a></td><td width="100" bgcolor="#F5F5F5"><a><div style="margin-left: 5">';
  $size = filesize($katalog.$file);
  printf (" [%.2f kB]", $size/1024);
  echo '</a></td></tr></table>';    
  
                                }

?>


Jak zrobić że jeśli nie wykryje rozszerzenia z mojej listy to wstawi domyślną ikonkę ?
darko
Aż się prosi o switch - case
thek
Można switch-case, albo tablica w formie klucz=>wartość jako rozszerzenie => obrazek_pliku. Choć moim zdaniem switch case lepszy, bo można upraszczać przy takich formach jak case 'jpg', case 'jpeg' itp smile.gif No i nie obcinamy ostatnich 3 znaków tylko od ostatniej kropki!
david8213
chcę to skrócić

Kod
if (substr($file, strlen($file) - 3, 3) == "avi") {
  echo "<img align=absmiddle src='img/avi.bmp' /> "; }

if (substr($file, strlen($file) - 3, 3) == "bmp") {
  echo "<img align=absmiddle src='img/bmp.bmp' /> "; }

if (substr($file, strlen($file) - 3, 3) == "doc") {
  echo "<img align=absmiddle src='img/doc.bmp' /> "; }

if (substr($file, strlen($file) - 3, 3) == "exe") {
  echo "<img align=absmiddle src='img/exe.bmp' /> "; }

if (substr($file, strlen($file) - 3, 3) == "gif") {
  echo "<img align=absmiddle src='img/gif.bmp' /> "; }

if (substr($file, strlen($file) - 3, 3) == "jpg") {
  echo "<img align=absmiddle src='img/jpg.bmp' /> "; }

if (substr($file, strlen($file) - 3, 3) == "jpeg") {
  echo "<img align=absmiddle src='img/jpg.bmp' /> "; }

if (substr($file, strlen($file) - 3, 3) == "xls") {
  echo "<img align=absmiddle src='img/xml.bmp' /> "; }

if (substr($file, strlen($file) - 3, 3) == "html") {
  echo "<img align=absmiddle src='img/html.bmp' /> "; }

if (substr($file, strlen($file) - 3, 3) == "htm") {
  echo "<img align=absmiddle src='img/html.bmp' /> "; }

if (substr($file, strlen($file) - 3, 3) == "txt") {
  echo "<img align=absmiddle src='img/txt.bmp' /> "; }

if (substr($file, strlen($file) - 3, 3) == "mp3") {
  echo "<img align=absmiddle src='img/mp3.bmp' /> "; }

if (substr($file, strlen($file) - 3, 3) == "mpg") {
  echo "<img align=absmiddle src='img/mpg.bmp' /> "; }

if (substr($file, strlen($file) - 3, 3) == "mpeg") {
  echo "<img align=absmiddle src='img/mpg.bmp' /> "; }

if (substr($file, strlen($file) - 3, 3) == "pdf") {
  echo "<img align=absmiddle src='img/pdf.bmp' /> "; }

if (substr($file, strlen($file) - 3, 3) == "png") {
  echo "<img align=absmiddle src='img/png.bmp' /> "; }

if (substr($file, strlen($file) - 3, 3) == "php") {
  echo "<img align=absmiddle src='img/php.bmp' /> "; }

if (substr($file, strlen($file) - 3, 3) == "ppt") {
  echo "<img align=absmiddle src='img/ppt.bmp' /> "; }

if (substr($file, strlen($file) - 3, 3) == "rar") {
  echo "<img align=absmiddle src='img/rar.bmp' /> "; }

if (substr($file, strlen($file) - 3, 3) == "zip") {
  echo "<img align=absmiddle src='img/zip.bmp' /> "; }

if (substr($file, strlen($file) - 3, 3) == "tif") {
  echo "<img align=absmiddle src='img/tif.bmp' /> "; }

if (substr($file, strlen($file) - 3, 3) == "xml") {
  echo "<img align=absmiddle src='img/xml.bmp' /> "; }

if (substr($file, strlen($file) - 3, 3) == "tar") {
  echo "<img align=absmiddle src='img/tar.bmp' /> "; }

if (substr($file, strlen($file) - 3, 3) == "gz") {
  echo "<img align=absmiddle src='img/gz.bmp' /> "; }


Mogę to zrobić na tablicy :

Kod
$display['php'] = "img/php.bmp";
$display['html'] = "img/html.bmp";
$display['htm'] = "img/html.bmp";
$display['gif'] = "img/gif.bmp";
$display['jpg'] = "img/jpg.bmp";
$display['png'] = "img/png.bmp";
$display['tif'] = "img/tif.bmp";
$display['bmp'] = "img/bmp.bmp";
$display['ppt'] = "img/ppt.bmp";  // prezentacja
$display['pot'] = "img/ppt.bmp";  // prezentacja
$display['odp'] = "img/ppt.bmp";  // prezentacja openoffice
$display['odg'] = "img/ppt.bmp";  // prezentacja openoffice
$display['otp'] = "img/ppt.bmp";  // prezentacja openoffice
$display['sxi'] = "img/ppt.bmp";  // prezentacja openoffice
$display['jpeg'] = "img/jpg.bmp";
$display['txt'] = "img/txt.bmp";
$display['doc'] = "img/doc.bmp";
$display['docx'] = "img/doc.bmp";
$display['odt'] = "img/doc.bmp";  // word openoffice
$display['rtf'] = "img/doc.bmp";  // word
$display['xml'] = "img/xml.bmp";
$display['ods'] = "img/xml.bmp";  // excel openoffice
$display['xlt'] = "img/xml.bmp";  // excel
$display['xls'] = "img/xml.bmp";  // excel
$display['mp3'] = "img/mp3.bmp";
$display['pdf'] = "img/pdf.bmp";
$display['exe'] = "img/exe.bmp";
$display['rar'] = "img/rar.bmp";
$display['zip'] = "img/rar.bmp";
$display['tar'] = "img/rar.bmp";
$display['gz'] = "img/rar.bmp";
$display['ddb'] = "img/ddb.bmp";
$display['avi'] = "img/avi.bmp";
$display['mpg'] = "img/mpg.bmp";


Jak to wywołać ... ? Bo coś mi nie wychodzi

echo "<img align=absmiddle src=\"";
echo $display[get_extension($file)];
echo "\"> ";
altruista2
ehh, a jak plik będzie miał rozszerzenie .jpeg albo .html to te wszystkie wasze skrypty padają....
  1.  
  2. function file_ext($filename) {
  3. $tmp = explode('.',$filename);
  4. $count = count($tmp);
  5. if($count <= 1) {
  6. return false;
  7. }else{
  8. return strtolower($tmp[$count-1]);
  9. }
  10. }
  11.  
  12. // Tablica
  13. $icons = Array(
  14. 'html' => 'html',
  15. 'jpg' => 'jpg',
  16. 'rar' => 'rar',
  17. 'zip' => 'rar'
  18. /* i tak dalej... */
  19. );
  20.  
  21.  
  22. // Twoja pętla
  23. while($file = readdir($opdir))) {
  24. if($ext = file_ext($file)) {
  25. echo '<img src="img/'.$icons[$ext].'.bmp">';
  26. }
  27. }
  28.  


switch:case jest dobre tylko wtedy gdy wykonujemy różny kod dla różnych zmiennych
Pilsener
Cytat
Rozpoznajesz plik po rozszerzeniu
- Wy chyba nie macie żadnej wizji, jak to ma działać. Przecież plik może mieć ten sam typ (np. obrazek jpg), ale różne rozszerzenie, co nie? Takie rzeczy robi się po typie MIME, tworzy się tabelę w bazie danych:
typ MIME | Klasa CSS | Inne

I przy wyświetlaniu pliku dołącza się JOINem klasę CSS i wyświetla na stronie:
  1. <a href="plik.jakis" class="klasa css z bazy">pobierz</a>


Lub wrzucamy to do tablicy (jeśli korzystamy np. z plików a nie bazy):
  1. $tablica['typ_mime_1'] = 'klasa css 1';
  2. $tablica['typ_mime_2'] = 'klasa css 2';
- tablicę typów możesz trzymać np. w pliku tekstowym

Następnie przy generowaniu kodu html korzystamy z funkcji:
http://pl2.php.net/manual/pl/function.array-key-exists.php

Która sprawdzi, czy podany typ pliku jest w tablicy, jeśli tak to wyświetlamy:
  1. echo '<a href="plik.jakis" class="'.$tablica_typow[$typ_mime_pliku].'">pobierz</a>';
- a jeśli nie to dajemy jakąś klasę uniwersalną, np. "nieznany typ pliku". Oczywiście pobrać listę plików/plik wraz z parametrami takimi jak nazwa, rozmiar, data uploadu, typ mime etc. umiesz?

Po co Wam te ify czy switche? To się robi na tablicach dwoma linijkami kodu.
altruista2
@up: serio będziesz odczytywał typ MIME dla np. 1000 plików? Wydajne rozwiązanie, nie ma co...

I po cholerę robić klasy CSS skoro jemu potrzebne jest tylko zmienianie obrazka ikonki?

I skrypt wyświetlający listę plików ma potrzebować dostęp do bazy danych?!

Dość kiepska ta twoja wizja biggrin.gif
david8213
Zrobiłem coś takiego

Kod
<?PHP
//ikonki
function file_ext($filename) {
   $tmp = explode('.',$filename);
   $count = count($tmp);
   if($count <= 1) {
     return false;
  }else{
     return strtolower($tmp[$count-1]);
  }
}

// Tablica
$icons = Array(
'html' => 'html',
'jpg'  => 'jpg',
'rar' => 'rar',
'zip' => 'rar'
//ikonki koniec
);




      $katalog = '../grafik/';
      $dirArray = array();
      $opdir = opendir("../grafik");
  
      while($file = readdir($opdir)){
  
      if ($file === '.' || $file === '.' || $file === '..' ||  $file === 'index.php' || $file === 'grafik 2010_pliki') continue;
  
      $dirArray[] = $file;
  
      }
  
      closedir($opdir);  
            
      sort($dirArray);
  
      foreach($dirArray as $file){



  echo '<table><tr><td width="500" bgcolor="#F5F5F5">';

  echo '... ';

if($ext = file_ext($file)) {
echo '<img src="img/'.$icons[$ext].'.bmp">';
}


  echo '<a href="../grafik/'.$file.'" target=blank>'.$file.'</a></td><td width="100" bgcolor="#F5F5F5"><a><div style="margin-left: 5">';
  $size = filesize($katalog.$file);
  printf (" [%.2f kB]", $size/1024);
  echo '</a></td></tr></table>';    
  
                                }

?>


Działa
Można jeszcze zrobić że jak nie będzie w mojej 'bazie' dodanej ikonki to wyświetli mi domyślną ?
Kshyhoo
Cytat(altruista2 @ 14.02.2010, 11:27:10 ) *
ehh, a jak plik będzie miał rozszerzenie .jpeg albo .html to te wszystkie wasze skrypty padają....

Wcale nie:
  1. if (substr($file, strlen($file) - 4, 4) == "html") {
  2. echo "<img src='html.png' />";
  3. }

altruista2
Co to znaczy "nie działa do końca"?

@Ksyhoo:
Będziesz dla każdego rozszerzenia wywoływał substr i strlen ? Poza tym już nei wspomnę że jak już chcesz się trzymać tego substr to już lepiej zrobić:
  1. $rozszerzenie = substr($file,-3);

smile.gif
Kshyhoo
Przy 1000 rozszerzeń nie ma kompromisu między wydajnością a funkcjonalności ;p
david8213
Działa,działa - Dzięki
Można jeszcze zrobić że jak nie będzie w mojej 'bazie' dodanej ikonki to wyświetli mi domyślną ?
Kshyhoo
  1. '' => 'nic'

aarambo.gif
altruista2
Domyślna:
  1. $ext = file_ext($file)
  2. if($icons[$ext]) {
  3. echo '<img src="img/'.$icons[$ext].'.bmp">';
  4. }else{
  5. echo '<img src="img/domyslna.bmp">';
  6. }


@kshyhoo:
A jak rozszerzenie to będzie *.byleco questionmark.gif
Cytat
dobry programista to taki który patrzy w obydwie strony jezdni
david8213
jak rozszerzenie będzie inne niż w tablicy to pojawi się ikonka domyślna
altruista2
Tak, napisałem przecież:
Cytat(altruista2 @ 14.02.2010, 13:32:59 ) *
Domyślna:
  1. $ext = file_ext($file)
  2. if($icons[$ext]) {
  3. echo '<img src="img/'.$icons[$ext].'.bmp">';
  4. }else{
  5. echo '<img src="img/domyslna.bmp">';
  6. }
david8213
Ta domyślna nie działa Gdzieś jest błąd

Kod
<?php

                     //ikonki
function file_ext($filename) {
   $tmp = explode('.',$filename);
   $count = count($tmp);
   if($count <= 1) {
     return false;
  }else{
     return strtolower($tmp[$count-1]);
  }
}

                     // Tablica //rozszerzenie -> nazwa pliku
$icons = Array(
'html' => 'html',    
'htm' => 'html',
'php' => 'php',
'jpg'  => 'jpg',
'tif' => 'tif',
'bmp'  => 'bmp',
'png'  => 'png',
'rar' => 'rar',
'tar' => 'tar',
'gz' => 'gz',
'zip' => 'rar',
'exe' => 'exe',
'txt' => 'txt',
'pdf' => 'pdf',
'doc' => 'doc',
'xml' => 'xml',
'xls' => 'xml',
'ppt' => 'ppt',
'ddb' => 'ddb',
'mp3' => 'mp3',
'mp4' => 'mp3',
'avi' => 'avi',
'mpg' => 'mpg',
'mpeg' => 'mpeg',
'xml' => 'xml'
);                 //ikonki koniec



      $katalog = '../grafik/';                           // Zmienna potrzebna do wyświetlenia rozmiaru pliku
      $dirArray = array();
      $opdir = opendir("../grafik");

      while($file = readdir($opdir))  {                    // Pliki i foldery które nie będą wyświetlane
      if ($file === '.' || $file === '.' || $file === '..' ||  $file === 'index.php' || $file === 'grafik 2010_pliki') continue;
  
      $dirArray[] = $file;            }
    
      closedir($opdir);  
      sort($dirArray);

      foreach($dirArray as $file)         {                   // Pętla wykonywana dla każdego pliku
          echo '<table><tr><td width="500" bgcolor="#F5F5F5">';

         $ext = file_ext($file)
if($icons[$ext]) {
    echo '<img src="img/'.$icons[$ext].'.bmp">';
}else{
    echo '<img src="img/domyslna.bmp">';
}                     }

          echo '<a href="../grafik/'.$file.'" target=blank>'.$file.'</a></td><td width="100" bgcolor="#F5F5F5"><a><div style="margin-left: 5">';
          $size = filesize($katalog.$file);                     // Rozmiar pliku
          printf (" [%.2f kB]", $size/1024);                    // Rozmiar pliku
          echo '</a></td></tr></table>';  
                                          }
?>
altruista2
  1. $ext = file_ext($file)

  1. $ext = file_ext($file);

Bez przesady sad.gif Za rączke widze trzeba tongue.gif
david8213
Dzięki. Działa.Zapomniałem średnika
altruista2
Kliknij pomógł to temat zaświeci się na żółto....
Pilsener
Cytat(altruista2 @ 14.02.2010, 12:01:37 ) *
@up: serio będziesz odczytywał typ MIME dla np. 1000 plików? Wydajne rozwiązanie, nie ma co...

I po cholerę robić klasy CSS skoro jemu potrzebne jest tylko zmienianie obrazka ikonki?

I skrypt wyświetlający listę plików ma potrzebować dostęp do bazy danych?!

Dość kiepska ta twoja wizja biggrin.gif


1. Nikt nie mówił, że wyświetlone będzie na raz 1000 plików a nawet jeśli to pobranie rozszerzeń zamiast typów mime nie będzie dużo szybsze.
2. Nikt też nie mówił, skąd te pliki się tam wzięły, zakładam, że z jakiegoś standardowego uploadu, który był tu wielokrotnie omawiany, czyli są informacje w bazie.
3. Klasy CSS po to, że każdy <img to więcej kodu i więcej żądań http, strona z wykorzystaniem CSS będzie kilka razy szybsza od tej, gdzie wszystko będzie w HTML, ma to też dużo innych zalet, choćby łatwa zmiana wyglądu czy możliwość wielokrotnego zastosowania.

Jeżeli chce człowiek zrobić prowizorkę to też nie rozumiem, po co ten cały kod mu dajecie? Nie wystarczy, by rozszerzenie pliku = nazwa ikony, a wcześniej sprawdzić czy ikona istnieje funkcją file_exists?

  1. if(file_exists('img/'.$ext.'.bmp')) {
  2. echo '<img src="img/'.$ext.'.bmp">';
  3. }else{
  4. echo '<img src="img/domyslna.bmp">';
  5. }
- ? I gotowe, ext to oczywiście rozszerzenie pliku. I czemu ikony w bmp a nie png?

//edit: literówka w kodzie
krzysiekk
witam moze mdo odczytania foleru trzeba wykozytac klase php5
  1. $dir =new RecursiveIteratorIterator(new RecursiveDirectoryIterator("../userfiles/"));

a w niej sa zdefinowane metody obslugi odczytanuch plikow
np do pobrani asciezki $dir->getPathname());
altruista2
Cytat
Jeżeli chce człowiek zrobić prowizorkę to też nie rozumiem, po co ten cały kod mu dajecie? Nie wystarczy, by rozszerzenie pliku = nazwa ikony, a wcześniej sprawdzić czy ikona istnieje funkcją file_exists?

Żeby jpeg odczytywał się tak samo jak jpg i zip tak samo jak rar
Pilsener
No to sobie skopiuje tą samą ikonkę tylko z inną nazwą - z tego co widzę to będzie dla niego nawet prostsze, niż babranie się w kodzie PHP smile.gif

Edit: i na pewno szybsze, niż sprawdzanie tablicy za każdym razem (zwłaszcza, jak jest duża).
david8213
Mój końcowy kod wygląda następująco. Wszystko działa jak w założeniach:


Kod
<?php

                    
function file_ext($filename) {
   $tmp = explode('.',$filename);
   $count = count($tmp);
   if($count <= 1) {
     return false;
  }else{
     return strtolower($tmp[$count-1]);
  }
}

                    
$icons = Array(
'html' => 'html',    
'htm' => 'html',
'php' => 'php',
'jpg'  => 'jpg',
'tif' => 'tif',
'bmp'  => 'bmp',
'png'  => 'png',
'rar' => 'rar',
'tar' => 'tar',
'gz' => 'gz',
'zip' => 'rar',
'exe' => 'exe',
'txt' => 'txt',
'pdf' => 'pdf',
'doc' => 'doc',
'xml' => 'xml',
'xls' => 'xml',
'ppt' => 'ppt',
'ddb' => 'ddb',
'mp3' => 'mp3',
'mp4' => 'mp3',
'avi' => 'avi',
'mpg' => 'mpg',
'mpeg' => 'mpeg',
'xml' => 'xml'
);              

      $katalog = '../grafik/';        
      $dirArray = array();
      $opdir = opendir("../grafik");

      while($file = readdir($opdir))  {       
      if ($file === '.' || $file === '.' || $file === '..' ||  $file === 'index.php') continue;
  
      $dirArray[] = $file;            }
    
      closedir($opdir);  
      sort($dirArray);

      foreach($dirArray as $file)         {                  
          echo '<table><tr><td width="500" bgcolor="#F5F5F5">';
  
          $ext = file_ext($file);                                        
          if($icons[$ext]) {
      echo '<img align=absmiddle src="img/'.$icons[$ext].'.bmp"> ';  }
             else   {
         echo '<img align=absmiddle src="img/domyslna.bmp"> ';
                    }

          echo '<a href="../grafik/'.$file.'" target=blank>'.$file.'</a></td><td width="100" bgcolor="#F5F5F5"><a><div style="margin-left: 5">';
          $size = filesize($katalog.$file);                    
          printf (" [%.2f kB]", $size/1024);                 
          echo '</a></td></tr></table>';  
                                          }
?>
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.