2013-04-02 3 views
3

Я пытаюсь использовать ImageMagick для некоторых манипуляций с фотографиями (урожай на данный момент). Раньше я добился желаемого результата, используя библиотеку GD для PHP (на моем локальном хосте), но теперь хостинг не поддерживает ее, и они предлагают мне вместо этого использовать ImageMagick. Проблема в том, что я могу обрезать изображение, которое она хранится локально:PHP ImageMagick получить изображение с http

<?php 
$four = '4fingers1.jpg'; 
exec("convert $four -crop 100x100+100+100 test.jpg"); 
?> 
<img src="test.jpg"> 

без проблем, но когда речь идет от источников HTTP (фактическая цель моего сценария) я не получаю никакого образа. Код следующее (я отправляю с формой фактического ГКЗ изображения):

$src = $_POST['src']; 
exec("convert $src -resize 720x720 resized.jpg"); // this is specified in the documentation 
exec("convert resized.jpg -crop 100x100+100+100 final.jpg"); 
?> 
<img src="final.jpg"> <!-- no image --> 
<img src="resized.jpg"> <!-- no image --> 
<img src="<?php echo $src; ?>"> <!-- alright --> 

документации указать следующее:

IM can also download an image that is published on the 'world wide web' by specifying that images URL. This basically provides a 'http:' image coder, which is why it works.

Ссылка: http://www.imagemagick.org/Usage/files/#read

Я пробовал множество фрагментов кода, основанных онлайн, и не может понять, почему он не работает? Я могу использовать, может быть, что-то еще для достижения моей цели?

+4

Будьте очень осторожны с вашим '$ _POST ['src']' и 'exec'. – Prisoner

+0

Я искал другие решения, но ничто, похоже, не соответствует моей потребности, о которой я знаю ... –

ответ

0

Сначала я с ответом Джона и комментарий Заключенного. Вы должны будете бежать $ ЦСИ POST вар, чтобы предотвратить от инъекции командной оболочки с помощью escapeshellarg():

$src = escapeshellarg($_POST); 

Далее вы должны использовать второй из параметров (выход из команды) и третий (из параметров возвращаемого значения команды) и уважайте его.

Вызов exec() так:

exec("convert $src -resize 720x720 resized.jpg 2>&1", $output, $returnval); 

if($returnval !== 0) { 
    die('imagemagick error: ' . join("<br/>", $output)); 
} 

Теперь вы можете реагировать на ошибки, и вы можете увидеть, что происходит не так. Обратите внимание, что я перенаправил stderr из imagemagick в stdout с использованием перенаправления оболочки()

+0

Благодарим вас в первую очередь за быстрый ответ. Я следил за вашим предложением относительно 'escapeshellarg' и, к сожалению, я получаю следующую ошибку:' imagemagick error: Array'. Что это значит? Я должен повторить его, чтобы найти значение ошибки/код или что-то подобное? –

+0

Извините, я виноват! ;) Я пропустил, что $ output будет массивом строк. Проверьте мое обновление – hek2mgl

+0

Нет проблем, ваша помощь отличная. Хорошая сторона заключается в том, что часть массива ушла, но плохая сторона заключается в том, что теперь я получаю ошибку «imagemagick»: «... Я мог бы попытаться предложить Jon's обрабатывать временные файлы, может быть, это может помочь? –

3

Прежде всего, поскольку Заключенный comments этот код уязвим для инъекции аргументов оболочки. В принципе, каждый может манипулировать параметрами сообщения и заставлять вас выполнять любую командную строку, которую они хотят; это потенциально катастрофическое и должно быть немедленно устранено!

Одним из способов устранения проблемы безопасности является использование escapeshellarg; это также должно устранить вашу «оригинальную» проблему, поскольку нет очевидной причины отказа команды. Если URL-адрес действителен и аргумент правильно экранирован, он должен просто работать.

В качестве альтернативы, вы можете решить как головная боль безопасности и исходную проблему путем загрузки образа себя и сохранить его во временный файл перед вызовом IM:

$temp = tempnam(sys_get_temp_dir()); 
file_put_contents($temp, file_get_contents($url)); 

exec("convert ".escapeshellarg($temp)." -crop 100x100+100+100 test.jpg"); 
+0

Приятный пример сохранения во временный файл. Это то, что мне действительно нужно. Спасибо.Я попробую! –

0

Проблема была в том, что у IM есть проблемы с протоколом https в моем случае. Я проверил с HTTP изображения и все работает нормально, так что я сделал следующее:

<?php 
$src = $_POST['src']; 
$src = preg_replace('/^https\:\/\//', 'http://', $src); 
$src = escapeshellarg($src); 
exec('convert ' . $src . ' resized.jpg 2>&1', $output, $returnval); 
if($returnval !== 0) { 
    die('imagemagick error: ' . join("<br/>", $output)); 
} 
?> 
<img src="resized.jpg"> 

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

+0

Может ли быть, что сайт использует ненадежный сертификат, который вызывает проблему? – hek2mgl

+0

Я не знаю об этом, но это может быть проблемой в моем случае, я не пробовал на самом деле с другими изображениями https. –

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