2011-03-04 57 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()文档)。