【问题标题】:How to get images from over webscope using PHP?如何使用 PHP 从 webscope 获取图像?
【发布时间】:2011-03-30 01:58:31
【问题描述】:

如何在位于 webscope 上方的网页上显示图像?图片位于/home/image.jpg,网站位于/home/www/example.com/index.php,指的是@ 987654321@.

我已尝试使用此代码检索图像,但它不起作用:(

header('内容类型:图片/jpeg'); 读取文件(真实路径(“/home/image.jpg”));

我也试过这个版本:

header('内容类型:图片/jpeg'); $image = imagecreatefromjpeg(realpath('../../image.jpg')); // 输出图像和空闲内存 图像JPEG($图像); 图像销毁($图像);

当我尝试使用此代码读取文件时:

fopen(realpath("../.."). '/image.jpg', 'r+');

返回这个错误

警告:fopen(/home/image.jpg)[function.fopen]:无法打开流:第 4 行的 /home/www/example.com/image.php 中没有此类文件或目录

谁能帮帮我?我越来越绝望了!!!!!!

提前致谢。

【问题讨论】:

  • 你试过了吗../../image.jpg ?
  • 是的...也不起作用:(
  • 摆脱所有垃圾 - realpath 和 .. 东西。为什么在编写它时不能使用简单明了的路径?错误消息说没有这样的文件。再次检查它的路径。请注意,在 unix 系统上,文件名区分大小写。
  • 我已删除 realpath。我使用它的原因是因为另一个人告诉我使用它......

标签: php html image apache


【解决方案1】:

我敢打赌这是权限问题:运行您的脚本的用户可能不允许访问/home 中的文件。

去掉content-type标头,打开error_reporting(E_ALL);:PHP会告诉你为什么它不能访问文件。

如果这是问题所在,那么您最好将图像存储在其他地方,并赋予该目录必要的权限。

附带说明,无需像在示例中那样创建和销毁图像(除非您明确希望这样做,例如删除 ID3 和其他元数据)。一个简单的fpasshtru() 就可以了。

$name = '/path/to/image';
$fp = fopen($name, 'rb');

// send the right headers
header("Content-Type: image/jpeg");
header("Content-Length: " . filesize($name));

// dump the picture and stop the script
fpassthru($fp);
exit;

【讨论】:

  • 不要下注。也不猜。预测和算命也是如此。阅读错误消息并确定。
  • 它说图像不存在,但我不明白...我可以通过我的 ftp 程序看到它 lol
  • @Mathias 你知道 FTP 程序的根目录不一定是系统的绝对路径吗?
  • 是的,但是当我在脚本中使用相对路径时,这应该没关系吧?
  • @Mathias 不是真的,但它使确定文件是否实际存在变得更加困难。可以换个目录试试吗?
【解决方案2】:

确保允许 PHP 读取文件,如果不能,fopen($filename, 'r+'); 将返回 FALSE。

【讨论】:

  • 感谢您的回答!我试过这个代码 fopen(realpath( "../.." ) . '/image.jpg', 'r+' ); 它返回这个错误 Warning: fopen(/home /image.jpg)[function.fopen]:无法打开流:第 4 行的 /home/www/example.com/image.php 中没有这样的文件或目录。有什么我可以做的吗?
  • “没有这样的文件”非常明确。
  • 我已与托管我网站的公司进行了交谈。他们说我可以将文件放在文件夹中,然后用 php 脚本检索它们。它是我的应用程序中的一个关键功能,我愿意付钱给任何人来解决这个问题。因此,如果您认为可以,请说出来
【解决方案3】:

您的第一个示例应该是这样的。
无需寻找其他任何东西。

我已尝试使用此代码检索图像,但它不起作用:(

当代码不工作时,程序员应该调试它,找出原因。并修复。

因此,您必须以某种方式收到错误消息。你查看过error_log吗?

【讨论】:

  • 它说图像不存在。不幸的是,这是我唯一的线索:(
【解决方案4】:

让我们为您的脚本添加更多错误处理

<?php
$path = '/home/image.jpg';

$fp = fopen($path, 'rb');
if ( !$fp ) {
  foo($path);
}

if ( !headers_sent() ) {
  header('Content-type: image/jpeg');
  fpassthru($fp);
}

die;
function foo($path) {
  echo 'failed'; flush();

  $out = date("Y-m-d H:i:s\n");
  $out .= " cwd=".getcwd()."\n";
  $out .= " fopen($path) failed\n";
  $dir = dirname($path);
  if ( !is_dir($dir) ) {
    $out .= " $dir is NOT a directory\n";
  }
  else {
    $out .= " $dir contains the following files:\n";
    foreach(glob($dir.'/*') as $fn) {
      $out .= '   '.$fn."\n";
    }
  }
  $out .= "\n\n";

  error_log($out, 3, 'soError.log');
}

留意文件soError.log

【讨论】:

  • 非常感谢您的代码!我已经尝试过使用不同的目录并得到了一些有趣的结果。我只是没有正确阅读错误消息的知识:(
【解决方案5】:

也许您的网络主机配置了open_basedir,并且/home 目录超出了其限制,导致您的脚本无法访问该图像。

您可以通过执行ini_get('open_basedir'); 并查看返回的内容来检查它是否已设置。

【讨论】:

  • open_basedir() 设置为“无值”。这是什么意思?
  • 表示它不受限制,因此 open_basedir 限制不会导致此问题。
  • 好的 :-) 很高兴消除该选项。一个下来,还有很多事情要做xD谢谢!
猜你喜欢
  • 2011-03-28
  • 2019-03-05
  • 1970-01-01
  • 1970-01-01
  • 2018-02-15
  • 2013-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多