【问题标题】:PHP Image content type problemPHP 图片内容类型问题
【发布时间】:2011-06-04 05:21:57
【问题描述】:

我有一个具体问题,无法克服。

对于我的最新项目,我需要一个简单的 PHP 脚本,该脚本根据通过 URL 发送的 ID 显示图像。代码如下:

header("Content-type: image/jpeg");
$img = $_GET["img"];
echo  file_get_contents("http://www.somesite.hr/images/$img");

问题是图像没有显示,尽管浏览器识别它(我可以在页面标题中看到它),而是打印出图像 URL。

无论是在允许远程访问的服务器上,还是在不允许远程访问的服务器上,它都不起作用。 此外,在标题之前不会打印或回显任何内容。

我想知道这是内容类型错误还是其他原因。 提前致谢。

【问题讨论】:

  • 你想在浏览器上显示图片还是下载图片?
  • 确保echo 有效。尝试使用 curl 或 wget 获取该页面。并确保在回显之前不存在前面的空格。
  • 我解决了前两个问题,确实是空格和代码错误,但我仍然遇到远程访问问题,所以我不得不使用 CURL。你能帮我解决这个问题吗,因为我不太擅长 CURL?

标签: php header content-type


【解决方案1】:

图像可能不适合内存。或者您的 PHP 安装没有权限进行外部 HTTP 调用。无论如何,我建议你永远不要使用 echo file_get_contents(),而是使用 readfile。 此外,您永远不应该使用来自 $_GET 或 $_POST 的原始字符串进行文件操作。始终从用户提供的文件名中去除空字节、斜杠和双点,或者更好的是,只允许使用字母数字字符。

【讨论】:

  • 图片很小,这只是一个测试脚本。我同意你使用 readfile 和其他提示,但我已经尝试过 readfile 并且也不起作用。
【解决方案2】:

我最近正在做类似的事情,但发现这是一种缓慢的方法(我在一页上做了 15+)。这很慢,因为首先您的服务器必须下载图像,然后将其发送到客户端。这意味着每张图片都会被下载两次。

我想出了一个替代方案 - 重定向。这允许客户端机器直接访问其他站点,同时将真实的 url 隐藏在 HTML 源代码中。

$r - 在脚本之上进行处理,并进行验证以确保它正常。

$webFile = 'http://www.somesite.com/'.$r['type'].'/'.$r['productid'].'.jpg';
header('Location: '.$webFile);
exit();

如果有人将我的图片网址放在地址栏中,它会重定向并且用户会看到真实的网址,但它使我的页面更快,我并不太担心。

【讨论】:

    【解决方案3】:

    您需要确保您的脚本没有输出任何空白。检查打开/关闭 PHP 标记之前和之后。

    如果检查成功,您需要确保在 php.ini 中将 allow_url_fopen 设置为 On

    【讨论】:

      【解决方案4】:

      尝试在您的 html 中嵌入您的 php 文件,该文件以 <img> 检索图像

      getImage.php

      header("Content-type: image/jpeg");
      $img = $_GET["img"];
      echo  file_get_contents("http://www.somesite.hr/images/$img");
      

      在你的 html 文件中

      <img src="getImage.php?img=IMAGEID">
      

      【讨论】:

      • 我设法到了这里,但是以一种奇怪的方式,当我发送图像 ID 时它不起作用,它不显示图像。相反,当我单击图像源时,我收到消息“文档已移动”。
      【解决方案5】:

      您可能会遇到一些错误并且图像未显示。尝试先关闭这样的错误:

      ini_set('error_reporting', E_ALL);
      ini_set('display_errors', 'Off');
      

      【讨论】:

        【解决方案6】:

        检查该变量是否存在于查询字符串中,并使用正则表达式确保它不包含除字母数字字符或句点以外的任何内容。然后使用 readfile() 将输出流式传输到浏览器。

        // make sure the variable exists
        if (isset($_GET['image'])) {
            $image = $_GET['image'];
            // make sure it contains only letters, numbers, the underscore, and a period
        if (preg_match('/^[\w.]+$/', $image)) {
            $file = "http://www.example.com/images/$image";
            // send the correct header
            header('Content-type: image/jpeg');
            // stream the output
            readfile($file);
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2012-06-16
          • 2014-05-10
          • 1970-01-01
          • 2011-08-01
          • 2014-03-29
          • 1970-01-01
          • 1970-01-01
          • 2016-06-15
          • 2014-02-26
          相关资源
          最近更新 更多