Как получить изображения через веб-интерфейс с помощью PHP? - PullRequest
0 голосов
/ 15 августа 2010

Как я могу отобразить изображение на моей веб-странице, расположенной над веб-областью?Изображение находится по адресу / home / image.jpg , а веб-сайт расположен по адресу / home / www / example.com / index.php , что относится к http://example.com/.

Я пробовал этот код для получения изображения, но он не работает: (

    header('Content-type: image/jpeg');
    readfile( realpath( "/home/image.jpg" ));

И я тоже пробовал эту версию:

    header('Content-type: image/jpeg');

    $image = imagecreatefromjpeg( realpath('../../image.jpg'));

    // OUTPUT IMAGE AND FREE MEMORY
    imagejpeg($image);  
    imagedestroy($image);  

КогдаЯ пытаюсь прочитать файл с этим кодом:

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

Возвращает эту ошибку

    Warning: fopen(/home/image.jpg) [function.fopen]: failed to open stream: No such file or directory in /home/www/example.com/image.php on line 4

Может кто-нибудь помочь мне? Я впадаю в отчаяние !!!!!

Заранее спасибо.

Ответы [ 5 ]

1 голос
/ 15 августа 2010

Держу пари, что это проблема с правами доступа: пользователю, под которым работает ваш скрипт, скорее всего, не разрешен доступ к файлам в /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;
0 голосов
/ 15 августа 2010

Возможно, ваш веб-хост настроен на open_basedir, а каталог / home выходит за его пределы, что делает изображение недоступным для вашего сценария.

Вы можете проверить, установлен ли он, выполнив ini_get('open_basedir'); и посмотрев, что вернулось.

0 голосов
/ 15 августа 2010

Давайте добавим больше обработки ошибок в ваш скрипт

<?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.

0 голосов
/ 15 августа 2010

Ваш первый пример - как это должно быть.
Больше ничего не нужно искать.

Я пробовал этот код для получения изображения, но он не работает: (

Когда код не работает, программист должен отладить его, чтобы выяснить причину и исправить.

Итак, вы должны как-то получить сообщение об ошибке. Вы смотрелив error_log?

0 голосов
/ 15 августа 2010

Убедитесь, что PHP разрешено читать файл, fopen($filename, 'r+'); вернет FALSE, если вы не можете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...