【问题标题】:PHP imagejpeg() not working in OperaPHP imagejpeg()在Opera中不起作用
【发布时间】:2015-02-11 18:16:22
【问题描述】:

我正在使用以下代码来动态生成背景图片:

$image = imagecreatefromjpeg( 'FILENAME' );
header( 'Content-Type: image/jpeg' );
imagejpeg( $image );

当我尝试查看此脚本时,Opera 没有显示任何内容。 Chrome 和 IE 工作正常,如果我添加 header( 'Content-Disposition: attachment; filename=download.jpg' ); Opera 将按预期下载图像(并且内容正确)。

是否有解决方法,或者我没有设置一些标题?我很惊讶 Chrome 能正确处理图像,而 Opera(基于 Chromium)却不能。

更新:如果我改用 Content-Type: image/pngimagepng(),也会出现同样的问题:在除 Opera 之外的所有浏览器中加载,并且 Opera 会正确下载文件。

更新':这是一个扩展问题,但我不知道为什么。将我的网站添加到 uBlock 的白名单使一切正常。我的网站流量几乎为零,当然也没有垃圾邮件,所以这很奇怪。

【问题讨论】:

    标签: php gd opera


    【解决方案1】:

    在这种情况下,更简洁的解决方案是将“banner.php”放在您的图像文件夹之一中,并将其放在“banner.php”所在文件夹的.htaccess中:

    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} -s [OR]
    RewriteCond %{REQUEST_FILENAME} -l [OR]
    RewriteCond %{REQUEST_FILENAME} -d
    RewriteRule ^.*$ - [NC,L]
    RewriteCond %{REQUEST_URI}::$1 ^(/.+)(.+)::\2$
    RewriteRule ^(.*) - [E=BASE:%1]
    RewriteRule ^(.*)$ %{ENV:BASE}banner.php [NC,L]
    

    (前提是你在 Apache 中加载了 mod_rewrite)

    它检查图像是否存在,如果不存在则让banner.php 处理这项工作。

    这样您就可以只使用“banner.jpg”作为源,Opera 或其他任何人都不会知道它是动态生成的..

    【讨论】:

      【解决方案2】:

      有趣 - 我正在做同样的事情,它在 Opera 中打开就好了。唯一的区别是我添加了两行:

          header('Content-Type: image/jpeg');
          imagejpeg($img);
          imagedestroy($img);
          exit;
      

      添加一个带有 getimagesize($img) 结果的“Content-Length”标头也有帮助。也许 Opera 认为还有更多的事情要做——硬“退出”; i.c.w. “内容长度”您可以排除它并希望解决您的问题。

      更新:getimagesize() 不适用于动态生成的图像,但这个可以:

      header('Content-Type: image/jpeg');
      ob_start();
      imagejpeg($img);
      $size = ob_get_length();
      header("Content-Length: " . $size);
      ob_end_flush();
      imagedestroy($img);
      exit;
      

      仍然不确定它是否会解决 Opera 问题 - 但至少它发送了正确的标头..

      【讨论】:

      • 这太疯狂了,我无法理解。我添加了imagedestroy( $image ); exit();,没有任何改变(在任何浏览器中);因为图像是动态生成的(与上面的 sn-p 不同,它是 MWE)我尝试了header( 'Content-Length: ' . strlen( imagejpeg( $image ) ) );(这是正确的翻译吗?)并且没有任何改变。因为它可以在所有其他浏览器中正常工作并且下载正确,所以我怀疑它与空白有关。我很困惑。
      • 你说得对,getimagesize() 不适用于动态图像。但是 strlen(..) 也不会。我刚刚尝试了这个,它有效 - 它获取动态生成的图像的大小:header('Content-Type: image/jpeg'); ob_start(); imagejpeg($img); $size = ob_get_length(); header("Content-Length: " . $size); ob_end_flush(); imagedestroy($img); exit;
      【解决方案3】:

      问题超出了 PHP 的范围。我在Opera中安装了μBlock,生成图像的脚本名为banner.php; EasyList(包含在 μBlock 中)默认使用 src="banner.php" 阻止元素。我想是时候重命名它了site-logo.php

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-08-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多