2013-10-02 40 views
9

Sarebbe bello se qualcuno potesse aiutarmi a capire perché il browser non può caricare le immagini (errore 404). Il codice funziona e l'origine dell'immagine è corretta, ma non riesco a capire cosa c'è che non va. (using localhost)Come visualizzare le immagini da una cartella usando php - PHP

$dir   = '/home/user/Pictures'; 
$file_display = array(
    'jpg', 
    'jpeg', 
    'png', 
    'gif' 
); 

if (file_exists($dir) == false) { 
    echo 'Directory \'', $dir, '\' not found!'; 
} else { 
    $dir_contents = scandir($dir); 

    foreach ($dir_contents as $file) { 
     $file_type = strtolower(end(explode('.', $file))); 

     if ($file !== '.' && $file !== '..' && in_array($file_type, $file_display) == true) { 
      echo '<img src="', $dir, '/', $file, '" alt="', $file, '" />'; 
     } 
    } 
} 
+0

così perché non si registra il codice? –

+0

Proprio fatto. Dimenticato per il rientro – user2837048

+0

ci sono errori di sintassi nel codice sopra come in_array (non ha la parentesi di chiusura. $ Char nell'eco – jerjer

risposta

11

Si è verificato un errore nell'istruzione riportata di seguito. Uso . Non,

echo '<img src="', $dir, '/', $file, '" alt="', $file, $ 

a

echo '<img src="'. $dir. '/'. $file. '" alt="'. $file. $ 

e

echo 'Directory \'', $dir, '\' not found!'; 

a

echo 'Directory \''. $dir. '\' not found!'; 
+3

in realtà per l'istruzione echo, la virgola può essere utilizzato al posto dell'operatore concat – jerjer

+1

la virgola effettivamente ha prestazioni migliori rispetto a. sulle istruzioni di eco – jerjer

+1

la concatenazione di stringhe richiede una notevole quantità di memoria – jerjer

3

Ci sono due modi per farlo:

METODO 1. Il modo sicuro.

mettere le immagini su/www/htdocs/

<?php 
    $www_root = 'http://localhost/images'; 
    $dir = '/var/www/images'; 
    $file_display = array('jpg', 'jpeg', 'png', 'gif'); 

    if (file_exists($dir) == false) { 
     echo 'Directory \'', $dir, '\' not found!'; 
    } else { 
     $dir_contents = scandir($dir); 

     foreach ($dir_contents as $file) { 
      $file_type = strtolower(end(explode('.', $file))); 
      if (($file !== '.') && ($file !== '..') && (in_array($file_type, $file_display))) { 
       echo '<img src="', $www_root, '/', $file, '" alt="', $file, '"/>'; 
      break; 
      } 
     } 
    } 
?> 

METODO 2. Non protetto, ma più flessibile.

Metti le immagini su qualsiasi directory (apache deve avere il permesso di leggere il file).

<?php 
    $dir = '/home/user/Pictures'; 
    $file_display = array('jpg', 'jpeg', 'png', 'gif'); 

    if (file_exists($dir) == false) { 
     echo 'Directory \'', $dir, '\' not found!'; 
    } else { 
     $dir_contents = scandir($dir); 

     foreach ($dir_contents as $file) { 
      $file_type = strtolower(end(explode('.', $file))); 
      if (($file !== '.') && ($file !== '..') && (in_array($file_type, $file_display))) { 
       echo '<img src="file_viewer.php?file=', base64_encode($dir . '/' . $file), '" alt="', $file, '"/>'; 
      break; 
      } 
     } 
    } 
?> 

E creare un altro script per leggere il file immagine.

<?php 
    $filename = base64_decode($_GET['file']); 
    // Check the folder location to avoid exploit 
    if (dirname($filename) == '/home/user/Pictures') 
     echo file_get_contents($filename); 
?> 
+0

considerando il primo metodo penso che il istruzione "break" e verifica se la fine del file è "." o ".." non sono necessari a meno che non mi sia sfuggito qualcosa, quindi vorrei sapere cosa. –

7

Ecco una possibile soluzione la soluzione # 3 sui miei commenti a blubill Rispondiamo:

yourscript.php 
======================== 
<?php 
    $dir = '/home/user/Pictures'; 
    $file_display = array('jpg', 'jpeg', 'png', 'gif'); 

    if (file_exists($dir) == false) 
    { 
     echo 'Directory "', $dir, '" not found!'; 
    } 
    else 
    { 
     $dir_contents = scandir($dir); 

     foreach ($dir_contents as $file) 
     { 
      $file_type = strtolower(end(explode('.', $file))); 
      if ($file !== '.' && $file !== '..' && in_array($file_type, $file_display) == true)  
      { 
       $name = basename($file); 
       echo "<img src='img.php?name={$name}' />"; 
      } 
     } 
    } 
?> 


img.php 
======================== 
<?php 
    $name = $_GET['name']; 
    $mimes = array 
    (
     'jpg' => 'image/jpg', 
     'jpeg' => 'image/jpg', 
     'gif' => 'image/gif', 
     'png' => 'image/png' 
    ); 

    $ext = strtolower(end(explode('.', $name))); 

    $file = '/home/users/Pictures/'.$name; 
    header('content-type: '. $mimes[$ext]); 
    header('content-disposition: inline; filename="'.$name.'";'); 
    readfile($file); 
?> 
+0

Preferisco di gran lunga questo – afaolek

Problemi correlati