2011-03-04 120 views
0

我在我的web應用程序中有一個目錄,我想保留所有用戶個人資料圖片。用戶可以上傳所有類型的圖像(PNG,JPG,GIF)。不過,我希望圖片網址友好,例如。 http://example.com/static/picture/300-username,其中文件是300用戶名,但沒有擴展名。我想在用戶上傳時刪除擴展名,並使用PHP控制器添加:在不帶擴展名的瀏覽器中查看圖像

header('Content-Type: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, image/png'); 
readfile('http://example.com/static/picture/300-username'); 

這很有效。不過,我想知道,如果可以通過在圖片目錄中放置一個.htaccess文件,並使用某種標題來完成這項工作,那麼在這個目錄中讀取的任何文件都將顯示爲圖片。這可能嗎?

+5

這不是'Content-Type'。 – SLaks

+0

您是否將文件保存在服務器上而沒有任何文件擴展名? – drudge

+0

像這樣實現Content-type的缺點是什麼?它的工作原理...我保存它沒有擴展名,所以我不必檢測它是哪個擴展名。 – Samin

回答

5

不要刪除擴展名,只提供無延伸的URI,如/static/picture/300-username。然後添加一行到你的.htaccess中:

Options +MultiViews 

Apache會爲你設置正確的內容類型。請參閱Content Negotiation的文檔。

+0

太棒了!甚至比我預期的要好。 – Samin

0

首先你的道路需要物理存在,否則我不認爲Apache可以爲你做任何事情。

但是,這裏可能是一個解決方法,使用RewriteRule,保留擴展名(順便說一下,我認爲刪除文件的擴展名是個不好的習慣,特別是當它們不是純文本文件時),並接受請求的文件如300-username重寫爲300-username.jpg

+0

如果我保留擴展名,我如何檢測它與ModRewrite中的哪一個? – Samin

1

您不能指定多個Content-Type這樣的..你需要通過正確的標題爲每個圖像服:

<?php 
    $user = '300-username'; 
    $picture = 'http://example.com/static/picture/' . $user; 
    $info = getimagesize($picture); 
    $fp = fopen($picture, "rb"); 
    if ($info && $fp) { 
     header("Content-type: {$info['mime']}"); 
     fpassthru($fp); 
     exit; 
    } else { 
     // error 
    } 
?> 

(代碼改編自PHP的getimagesize()文檔)。