【问题标题】:How to handle a virtual URL in an img tag?如何处理 img 标签中的虚拟 URL?
【发布时间】:2023-03-27 10:49:01
【问题描述】:

我有一个 img 标记,其中定义了 src 值。但是,我不想显示这个 src 值,因为它会损害我的服务器。我被推荐使用虚拟 URL:IMG 标签指的是一个 URL,但是在这个方案中,URL 是一个虚拟的:/uploads/myuser/mypict.jpg 不会直接映射到图像,而是一个rewrite 规则会将此 URL 作为参数传递给 /uploads.php?url=myuser/mypict.jpg 脚本,并且此脚本将能够访问和发送 Web 根目录(Web 服务器根目录)之外的文件内容不适用于脚本的文件处理功能)Source

但我不明白img 标记如何访问 PHP 脚本,以及该脚本如何在img 标记中显示图像。

知道如何实现它吗?

更新:

我会给你们所有人一个回答的标记,......但我不能。 我终于找到了一种不带任何参数调用脚本的方法,因为图像的名称和路径都存储在数据库中。我正在使用 Symfony2,所以我将给出我的特定解决方案:

我只是在 Twig 模板中做:

<img src="{{ path('acme_home_seeImage') }}" width="{{ image.width }}" height="{{ image.height }}">

并添加路线:

acme_home_seeImage:
  pattern: /seeImage
  defaults: { _controller: AcmeHomeBundle:Home:seeImage}

然后,当页面加载时,img 标签触发seeImageAction() 方法,该方法处理以下代码:

public function seeImageAction() 
{
    if(!isset($_SESSION)) session_start();
    header('Content-type: image/png');
    if(isset($_SESSION['id'])) {
        //call to image in database
        $em = $this->getDoctrine()->getEntityManager();
        $image = $em->getRepository('AcmeHomeBundle:Image')->find($_SESSION['id']);
        readfile($image->getPath());
    } else {
        readfile('public/img/default.png');
    }   
}

因为图像与客户端的会话 ID 相关联。 就这样!现在,我可以成功地将上传目录放在Document Root之外,并且我的上传路径保持隐藏。

【问题讨论】:

    标签: php html image url symfony


    【解决方案1】:

    IMG SRC 属性链接到“图像”类型的资源。图像是一袋八位字节。所以你的服务器要做的就是发回一包八位字节:)

    通常,SRC 属性是一个文件名,服务器将其解释为磁盘上的路径。重要的是服务器发回图像,无论其来源如何。所以它可能是磁盘上的文件或脚本生成的图像,它不在乎。

    如果链接指向一个脚本,那么该脚本唯一要做的就是生成一个图像并确保发送正确的标头。使用 PHP,您有多种生成图像的方法(在文件系统上读取并输出,从头开始生成,通过克隆/修改现有文件生成,...)然后对于标题,您有 the header function

    这篇文章可能会启发你:how to send png image from server to display in browser via ajax(Alexei 的回复就是你的回复)。

    【讨论】:

      【解决方案2】:

      让我用一个小的 ASCII 艺术来澄清这一点。

      Browser                      Server
         |
         | requests HTML
         |--------------------------->|
                                      | sends HTML back
         |<---------------------------|
         |
         | reads HTML,
         | finds <img>, re-
         | solves URL to
         | image from src attribute
         |
         | requests image /foo.jpg
         |--------------------------->|
                                      | searches foo.jpg,
                                      | but doesn't find
                                      | it. Configured to
                                      | call PHP script in this case:
                                      |
                                      |-----------------------> PHP script called
                                                                with URL foo.jpg.
                                                                Checks, if user has
                                                                right to view, and
                                                                if so, reads bar.jpg
                                      |<----------------------- and outputs that
                                      |
                                      | Takes output from PHP
                                      | and sends it to browser
         |<---------------------------|
         |
         | receives image bar.jpg,
         | but doesn't know. For the
         | browser it's called /foo.jpg
      

      诀窍是,/foo.jpg 不存在,而是服务器调用 PHP 脚本。这会进行权限管理并返回正确的数据。请注意,bar.jpg 无法通过服务器访问,也就是说,对/bar.jpg 的请求会给出401 Forbidden(或者更好的是,bar.jpg 的存储位置完全不同)。

      【讨论】:

        【解决方案3】:

        如果 php 脚本的标头设置为

        header('Content-Type: image/jpg');
        

        然后 php 脚本显示为 jpg 图像(到 img src),就像/uploads/myuser/mypict.jpg

        有一个例子:

        <?php
          header('Content-Type: image/jpg');
          readfile('/uploads/myuser/mypict.jpg');
        ?>
        

        然后你可以这样访问它:

        <img src="imghandler.php" alt="mypict.jpg"/ >
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-09-13
          • 1970-01-01
          • 1970-01-01
          • 2018-06-20
          • 1970-01-01
          • 2017-03-14
          • 2013-07-27
          • 2017-06-14
          相关资源
          最近更新 更多