【问题标题】:View images in browser with no extension在没有扩展的浏览器中查看图像
【发布时间】:2011-03-04 18:51:05
【问题描述】:

我的网络应用程序中有一个目录,我想在其中保存所有用户个人资料图片。用户可以上传所有类型的图像(png、jpg、gif)。但是,我希望图像 URL 友好,例如。 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 文件来完成,那么在此目录中读取的任何文件都将显示为图片。这可能吗?

【问题讨论】:

  • 您是否将文件保存在服务器上而没有任何文件扩展名?
  • 实现这样的内容类型的失败是什么?它有效...我保存它没有扩展名,所以我不必检测它是哪个扩展名。

标签: php apache .htaccess


【解决方案1】:

不要删除扩展,只需提供无扩展 URI,例如 /static/picture/300-username。然后在 .htaccess 中添加一行:

Options +MultiViews

Apache 将为您设置正确的内容类型。请参阅Content Negotiation 的文档。

【讨论】:

  • 太棒了!比我预期的还要好。
【解决方案2】:

你不能像那样指定多个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() 文档。)

【讨论】:

    【解决方案3】:

    首先你的路径必须是物理存在的,否则我认为 Apache 不能为你做任何事情。

    但是,这可能是使用RewriteRule 的解决方法,保留扩展名(顺便说一下,我认为删除文件的扩展名是不好的做法,尤其是当它们不是纯文本文件时),并接受请求像300-username 这样的文件重写为300-username.jpg

    【讨论】:

    • 如果我保留扩展名,如何使用 ModRewrite 检测它是哪一个?
    猜你喜欢
    • 2019-04-15
    • 2023-04-09
    • 2015-03-16
    • 1970-01-01
    • 2012-07-07
    • 2018-08-26
    • 1970-01-01
    • 2021-12-26
    • 1970-01-01
    相关资源
    最近更新 更多