LINUX.ORG.RU

php+ mysql - получить картинку


0

0

Преамбула:

есть две машины - на машине 1 гоняется в реальном времени нечто,
генерящее картинки и пихающее их в базу данных. База данных тоже 
на машине 1. В то же время на машине 2 висит веб-сервер и пхп 
приложение может обращаться в базу данных (и только туда) 
на машине 1

Задача: Как правильно давать пользователю ссылку, чтобы он мог 
наиудобнешим способом получить картинку, когда ему надо

Попытки реализации:

(1)

  //pull the picture
  $result = mysql_query($query) or die ("Error: can not select data");
 
  if ($result) {
    $num = mysql_numrows($result);
    $i=0;
    while ($i < $num) {
      $pngfile=mysql_result($result,$i,"bin_data");
      $i++;
    }
   
    $pnglength = strlen($pngfile); //the length of file

    //header for browser
    $h= "Content-Type: image/png\n";
    $h.="Content-Length: $pnglength\n";
    $h.="Content-Disposition: attachment; filename=$filename\n";
    header($h);
   
    //file itself
    print $pngfile;

  }
 
  // Free resultset
  mysql_free_result($result);

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

(2) Получить картинку из базы данных и сохранить ее, потом 
сгенерировать правильную ссылку и выдать хтмл со ссылкой на только 
что сохраненный файл. Недостаток очевиден - надо что-то писать на 
машине 2, а это вопросы привилегий!

Ниже код для сохранения картинки (с купюрами)

  //pull the picture
  $result = mysql_query($query);

  if ($result) {
    $num = mysql_numrows($result);
    $i=0;
    while ($i < $num) {
      $giffile=mysql_result($result,$i,"bin_data");
      $i++;
    }
  }
  else { return 1; } //error
 
  $giflength = strlen($giffile); //the length of file
 
  if (is_writable($filename)) {
   
    if (!$handle = fopen($filename, 'w')) {
      echo "Cannot open file ($filename)";
      return 3;
    }
   
    if (fwrite($handle, $giffile) == False) {
      echo "Cannot write to file ($filename)";
      return 2;
    }
   
    fclose($handle);
  }
 
  // Free resultset
  mysql_free_result($result);

Наверняка это более-менее стандартная задача! 
Какие есть еще подходы!!! ПОМОГИТЕ!
★★★

> то когда кликнет кто-то на ссылке и данный пхп запустится, то броузер сразу будет искать приложение

А если кто-то ПРАВИЛЬНО напишет заголовки, то браузер просто покажет картинку. Посмотри какие заголовки отдает сервер на картинку, и какие твой скрипт. Лишние выкинь.

no-dashi ★★★★★
()
Ответ на: комментарий от roller

Кажет IE png. Прозрачность не умеет только.

2atoku

Если я правильно помню, conten-disposition ставить не надо. Хватит просто Content-Type. Content-disposition заставляет браузер сохранять файл.

AngryElf ★★★★★
()
Ответ на: комментарий от AngryElf

Спасибо большое всем! Помогло!

atoku ★★★
() автор топика
Ответ на: комментарий от no-dashi

а можно как-нибудь сделать так, чтобы картинка всавлялась в html словно она прочитана с диска?

atoku ★★★
() автор топика
Ответ на: комментарий от atoku

В смысле?

Если ты ссылку на вышеописанный скрипт вставишь в html в виде
<img src="/тут/лежит/мой/скрипт?и=я&даже=передаю&туда=параметры"> ;
то все будет вроде так, как тебе нужно...
Расширения файлов - от фонаря. Главное - Content-Type в хедерах.

AngryElf ★★★★★
()
Ответ на: комментарий от AngryElf

Огромное спасибо! Все теперь просто классно получилось!

atoku ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.