2011-12-28 2 views
3

Я пишу простой сайт для нашего местного солдата Boy Scout, который должен позволять загружать изображения. Я использую PHP 4.3.9 для изменения размера изображений и создания эскизов, но (пожертвованный) хостинг-сервис не позволяет записывать файловые системы с PHP. Тем не менее, они обеспечивают 5G mysql. Я хочу, чтобы хранит изображения в базе данных, но не нашел способ конвертировать измененные изображения в JPEG. Насколько я могу судить, imagejpg будет записываться только в файл (который я не могу сделать). Кто-нибудь знает, можно ли сгенерировать JPEG в память в PHP? Спасибо! -ДжимJPEG сжимает изображение PHP в память

+2

О Maan .... Я знаю, вы не смотрите дареному коню в рот и т.д. и т. д., но веб-хостинг PHP, который не позволяет писать * файлы *? Это ужасно глупо. Кроме того, 4.3.9 является * очень старой версией и больше не поддерживается. Я бы подумал о переходе на достойный пакет хостинга, если это вообще возможно. –

+3

php4 давно мертв, настало время, когда вы обновили не менее 5,2 – Maerlyn

ответ

6

Вы можете использовать буферизацию вывода:

ob_start(); 
imagejpeg($image, NULL, 100); 
$image_data = ob_get_contents(); 
ob_end_clean(); 

Чтобы уточнить, если вы посмотрите на manual for imagejpeg, вы увидите, что вы можете использовать его либо записать в файл или вывода необработанного изображения поток напрямую, в зависимости от второго параметра. Я использую буферизацию вывода, чтобы захватить этот поток необработанного изображения.

+1

Чтобы уточнить: imagejpeg() не только записывает файлы, но также может отображать изображение на стандартный вывод. В этом ответе объясняется, как записать такой вывод. –

+0

@ Álvaro G. Vicario Вы правы, я добавлю небольшое объяснение в ответ. – jeroen

+1

Спасибо! Я видел вариант вывода rawjpeg, но думал, что будет возвращаться только в браузер. Полностью не знал о буферизации вывода! – Jim

0

Вы можете «сгенерировать память», но я не вижу, как вы планируете хранить изображение для последующего поиска. Если вы планируете просто изменять размер изображения каждый раз, когда кто-то загружает страницу, вы будете сжигать много процессорного времени. Поскольку нет возможности писать напрямую на диск (действительно?), Позвольте мне предложить вместо этого, что вы хотя бы сохранили изображение как BLOB в базе данных MySQL. Хотя это и неэффективно, а не хорошая практика, все же лучше, чем повторять одну и ту же работу каждый раз, когда страница обновляется.

В целом, я предлагаю сбросить «пожертвованного» поставщика и получить реальный веб-сервис. Почти каждая веб-хостинговая компания предоставляет некоторый колорит MySQL и PHP. Для общедоступного хостинга с использованием света вы, вероятно, можете уйти с чем-то за 10 - 20 долларов США в месяц. PHP 4.3.9 был выпущен в 2004 году. Будет сложно найти хорошую документацию для этой конкретной версии, и вы не можете игнорировать количество исправлений ошибок, сделанных с тех пор.

+0

Думаю, он планирует сохранить изображение в виде BLOB в базе данных, поэтому ему нужно захватить вывод imagejpeg. Но я согласен с остальными (о сбрасывании провайдера) –

+0

Eh. Пока я могу получить простой сайт и работать, $ 0/month бьет 10 долларов в месяц (120 долларов в год -> продает дополнительные 30 мешков попкорна! ;-)) И, да, изображения поступают в базу данных , – Jim

2

Я бы рекомендовал решение для буферизации вывода jeroen, но я добавлю это как классную альтернативу.

Используйте класс здесь http://www.php.net/manual/en/stream.streamwrapper.example-1.php

class VariableStream { 
    var $position; 
    var $varname; 

    function stream_open($path, $mode, $options, &$opened_path) 
    { 
     $url = parse_url($path); 
     $this->varname = $url["host"]; 
     $this->position = 0; 

     return true; 
    } 

    function stream_read($count) 
    { 
     $ret = substr($GLOBALS[$this->varname], $this->position, $count); 
     $this->position += strlen($ret); 
     return $ret; 
    } 

    function stream_write($data) 
    { 
     $left = substr($GLOBALS[$this->varname], 0, $this->position); 
     $right = substr($GLOBALS[$this->varname], $this->position + strlen($data)); 
     $GLOBALS[$this->varname] = $left . $data . $right; 
     $this->position += strlen($data); 
     return strlen($data); 
    } 

    function stream_tell() 
    { 
     return $this->position; 
    } 

    function stream_eof() 
    { 
     return $this->position >= strlen($GLOBALS[$this->varname]); 
    } 

    function stream_seek($offset, $whence) 
    { 
     switch ($whence) { 
      case SEEK_SET: 
       if ($offset < strlen($GLOBALS[$this->varname]) && $offset >= 0) { 
        $this->position = $offset; 
        return true; 
       } else { 
        return false; 
       } 
       break; 

      case SEEK_CUR: 
       if ($offset >= 0) { 
        $this->position += $offset; 
        return true; 
       } else { 
        return false; 
       } 
       break; 

      case SEEK_END: 
       if (strlen($GLOBALS[$this->varname]) + $offset >= 0) { 
        $this->position = strlen($GLOBALS[$this->varname]) + $offset; 
        return true; 
       } else { 
        return false; 
       } 
       break; 

      default: 
       return false; 
     } 
    } 

    function stream_metadata($path, $option, $var) 
    { 
     if($option == STREAM_META_TOUCH) { 
      $url = parse_url($path); 
      $varname = $url["host"]; 
      if(!isset($GLOBALS[$varname])) { 
       $GLOBALS[$varname] = ''; 
      } 
      return true; 
     } 
     return false; 
    } 
} 

Тогда вы можете просто сделать

stream_wrapper_register("var", "VariableStream") 
    or die("Failed to register protocol"); 

$GLOBALS['binaryImageContent'] = ''; 
imagejpg($im, 'var://binaryImageContent'); 
$data = $GLOBALS['binaryImageContent']; 
echo strlen($data); 
+2

Действительно! И, судя по всему, он даже работал бы на PHP 4.3.9. –

+0

Спасибо!Прохладная техника, плюс она дает мне больше информации о том, что можно сделать на PHP. (я на самом деле разработчик C/C++, никогда не дотрагивался до PHP, прежде чем заходить на сайт отряда). – Jim

Смежные вопросы