2013-10-02 69 views
9

如果有人能幫我弄清楚爲什麼瀏覽器無法加載圖像(錯誤404),那將是非常棒的。代碼有效,圖像源是正確的,但我無法弄清楚什麼是錯的。 (使用本地主機)如何使用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

那麼你爲什麼不張貼代碼? –

+0

剛剛做到了。忘了縮進。 – user2837048

+0

上面的代碼存在語法錯誤,比如in_array(沒有右括號,有人需要學習基本語法 – jerjer

回答

11

您在下面的語句中有錯誤。使用 。不,

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

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

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

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

實際上用於echo語句逗號可以被用來代替concat運算符 – jerjer

+1

這個逗號實際上有比較好的表現。在回聲陳述 – jerjer

+1

字符串串聯是內存密集 – jerjer

3

有兩種方式做到這一點:

方法1.安全的方式。

把圖像上/網絡/ 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; 
      } 
     } 
    } 
?> 

方法2不安全,但更靈活。

將圖像放在任何目錄(apache必須有權限讀取文件)。

<?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; 
      } 
     } 
    } 
?> 

並創建另一個腳本來讀取圖像文件。

<?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

考慮我認爲的第一種方法「break」語句並檢查文件的結尾是否爲「。」。或「..」是沒有必要的,除非我錯過了一些東西,然後想知道是什麼。 –

7

這裏是一個可能的解決方案對我的意見的解決方案#3 blubill的回答:

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

我更喜歡這個 – afaolek

相關問題