Imagick - не может читать файлы изображений из URL.
Я использую этот фрагмент для чтения изображений на разных сайтах:
$image = new Imagick('http://lp.hm.com/hmprod?set=key[source],value[/model/2012/P01 05156 06204 80 1175 4.jpg]&set=key[rotate],value[]&set=key[width],value[]&set=key[height],value[]&set=key[x],value[]&set=key[y],value[]&set=key[type],value[STILL_LIFE_FRONT]&call=url[file:/product/large]');
Но иногда я получаю такую ошибку (примерно в 20% случаев):
ImagickException
Unable to read the file: http://lp.hm.com/hmprod?set=key[source],value[/model/2012/P01 05156 06204 80 1175 4.jpg]&set=key[rotate],value[]&set=key[width],value[]&set=key[height],value[]&set=key[x],value[]&set=key[y],value[]&set=key[type],value[STILL_LIFE_FRONT]&call=url[file:/product/large]
Imagick->__construct()
Ошибка кажется последовательной во всей этой области, но иногда она отличается от изображения к изображению в той же области.
Вопросы
Почему это проблема?
Как мы можем это исправить?
Есть ли альтернативное решение?
4 ответов:
ШАГ 1: ПОЛУЧИТЬ URL
Шаг 2: сохраните содержимое блога в переменную$url = 'http://blablabla.com/blabla.jpeg';$image = file_get_contents($url);Шаг 3: создание объекта Imagick
$img = new Imagick();Шаг 4: поручите объекту imagick прочитать содержимое blob-объекта изображения
Шаг 5: сохранение (или выполнение операций) на изображении$img -> readImageBlob($image);$img -> writeImage('/var/www/html/uploads/img.jpg');Шаг 6: уничтожить экземпляр imagick
$img -> destroy();
Поэтому я решил, что мне нужно правильно закодировать url. Я не уверен, что этот код является оптимальным, но он работает.. и, надеюсь, сможет помочь кому-то еще.
$parsedUrl = parse_url('http://lp.hm.com/hmprod?set=key[source],value[/model/2012/P01 05156 06204 80 1175 4.jpg]&set=key[rotate],value[]&set=key[width],value[]&set=key[height],value[]&set=key[x],value[]&set=key[y],value[]&set=key[type],value[STILL_LIFE_FRONT]&call=url[file:/product/large]'); $info = pathinfo($parsedUrl['path']); $dirname = explode('/', $info['dirname'] ?: ''); $dirname = array_filter($dirname, 'strlen'); $dirname = array_map('urlencode', $dirname); $dirname = implode('/', $dirname); $basename = urlencode($info['basename'] ?: ''); $path = array_filter(array($dirname, $basename), 'strlen'); $path = '/' . implode('/', $path); $query = explode('&', $parsedUrl['query'] ?: ''); foreach ($query as &$set) { $set = explode('=', $set, 2); $set = array_map('urlencode', $set); $set = implode('=', $set); } $query = implode('&', $query); $uri = array_filter(array($path, $query), 'strlen'); $uri = implode('?', $uri); $fragment = urlencode($info['fragment'] ?: ''); $uri = array_filter(array($uri, $fragment), 'strlen'); $uri = implode('#', $uri); $scheme = $parsedUrl['scheme'] ?: ''; $host = $parsedUrl['host'] ?: ''; $url = array_filter(array($scheme, $host), 'strlen'); $url = implode('://', $url); $url .= $uri; $image = new Imagick($url);
Обс!
Этот код будет оставлять уведомления.
Попробуйте использовать функцию urlencode для кодирования специальных символов url:
$image = new Imagick(urlencode('http://lp.hm.com/hmprod?set=key[source],value[/model/2012/P01 05156 06204 80 1175 4.jpg]&set=key[rotate],value[]&set=key[width],value[]&set=key[height],value[]&set=key[x],value[]&set=key[y],value[]&set=key[type],value[STILL_LIFE_FRONT]&call=url[file:/product/large]'));Или, если не работает, попробуйте следующее:
$content = file_get_contents(urlencode('http://lp.hm.com/hmprod?set=key[source],value[/model/2012/P01 05156 06204 80 1175 4.jpg]&set=key[rotate],value[]&set=key[width],value[]&set=key[height],value[]&set=key[x],value[]&set=key[y],value[]&set=key[type],value[STILL_LIFE_FRONT]&call=url[file:/product/large]')); $image = new Imagick($content);
Я только что столкнулся с подобной проблемой. Я использовал file_get_contents () и получал то же самое "ImagickException имя файла слишком длинное". Исправление для меня состояло в том, чтобы найти каталог tmp и установить для него правильные разрешения.
Comments