PHP ImageCreateFromString и file_get_contents - PullRequest
2 голосов
/ 07 января 2010

Я пытаюсь создать функцию в PHP, которая позволит мне вводить практически любой URL, а затем запускать некоторые функции на нем так же, как если бы пользователь загружал на мой сервер.Поэтому я изменю размеры и сделаю несколько миниатюр, но мне нужна помощь, просто приведя изображение в состояние, в котором я могу запустить другие свои коды на нем.Другой пользователь на этом сайте помог мне начать работу с ImageCreateFromString () и file_get_contents ()

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

Я попробовал этот код ниже, используя URL-адрес, подобный этому, с URL-адресом фотографии, добавленным в URL моего скрипта:

http://example.com/friendproject2/testing/photos/fromurl/?url=http://a0.twimg.com/a/1262802780/images/twitter_logo_header.png

Но это ничего не показывает и даже неошибка

function getphotoURL($url){
    if(isset($url) && $url != 'bad') {
        $image = ImageCreateFromString(file_get_contents($url));
        if (is_resource($image) === true){
            echo 'The URL of the image we fetch is :' .$url. '<BR><BR>';
            //show image
            header('Content-Type: image/jpeg');
            imagejpeg($image, null, 100);
            imagedestroy($image); 
            imagedestroy($image); 
            // image is valid, do your magic here
        }else{
            // not a valid image, show error
            echo 'error getting URL photo from ' .$url;
        }
    }else{
        //url was empty
        echo 'The URL was not passed into our function';
    }
}
?>

###### UPDATE #####

Кажется, это была простая ошибка с моей стороны, что-топросто как проверка POST-запроса вместо GET-запроса, вот мой новый код ниже.

У меня есть пара проблем,

1) Я используюimagejpeg ($ image, null, 100);и мне интересно, я должен использовать что-то еще?Требуется ли исходное изображение в формате jpg или оно будет работать с любым изображением?Мне нужно разрешить основные типы (jpg, jpeg, gif, png)

2) так же, как и выше вопрос, но для отображения изображения на экране у меня установлен заголовок this: header('Content-Type: image / jpeg');Разве это не должно быть JPG для других типов изображений?

3) Есть ли способ, которым я могу убедиться, что переданный исходный URL-адрес является реальным изображением и делать все, что я хочу, еслиэто не изображение, например, показать свою ошибку или сделать собственный код, когда обнаружит, что URL не является действительным URL-адресом изображения

<?PHP
// run our function
if(isset($_GET['url']) && $_GET['url'] != "") {
    getphotoURL($_GET['url'],'no');
}


function getphotoURL($url, $saveimage = 'yes'){
    if(isset($url) && $url != '') {
        $image = imagecreatefromstring(file_get_contents($url));
        if (is_resource($image) === true){
            if($saveimage === 'yes'){
                // resize image and make the thumbs code would go here if we are saving image:
                // resize source image if it is wider then 800 pixels
                // make 1 thumbnail that is 150 pixels wide
            }else{
                // We are not saving the image show it in the user's browser
                header('Content-Type: image/png');
                imagejpeg($image, null, 100);
                imagedestroy($image); 
            }
        }else{
            // not a valid resource, show error
            echo 'error getting URL photo from ' .$url;
        }
    }else{
        // url of image was empty
        echo 'The URL was not passed into our function';
    }
}
?>

Ответы [ 2 ]

4 голосов
/ 12 августа 2011

После вызова imagecreatefromstring () для PNG или GIF (для прозрачности)

Выполните следующие манипуляции с изображением:

imagealphablending($image, true); // setting alpha blending on
imagesavealpha($image, true);

Превратит плоский черный фон в альфа-канал.

0 голосов
/ 07 января 2010

В ответ на ваши новые вопросы:

1) Я использую imagejpeg ($ image, null, 100); и мне интересно, я должен быть используя что-то еще? Требуется ли это исходное изображение будет JPG или будет это работает с любым изображением? Мне необходимо разрешить основные типы (JPG, JPEG, GIF, PNG)

Что ж, php.net говорит: «imagejpeg () создает файл JPEG из данного изображения». Но важная часть заключается в следующем: «Ресурс изображения, возвращаемый одной из функций создания изображения, такой как imagecreatetruecolor ().». А использование метода «imagecreatefromstring () возвращает идентификатор изображения, представляющий изображение, полученное из заданных данных. Эти типы будут автоматически обнаружены, если ваша сборка PHP поддерживает их: JPEG, PNG, GIF, WBMP и GD2». Итак, все должно быть в порядке.

2) тот же вопрос, что и выше, но когда показывая изображение на экране у меня есть заголовок установлен на это: заголовок ('Content-Type: image / jpeg'); не должно быть JPG для другого типа изображения

Заголовок должен иметь тип jpg - если это тип файла, значит, вы правы.

3) Есть ли способ, которым я могу убедиться что исходный URL передан в фактическое изображение и делать все, что я хочу, если это не изображение, как показать свое ошибка или сделать мой собственный код, как только он обнаружит что URL не является допустимым URL-адресом изображения

Да - вместо того, чтобы делать:

$image = ImageCreateFromString(file_get_contents($url));

Вы можете сделать:

$image = imagecreatefromjpeg($url);
if (!$image) echo "error"; 

imagecreatefromjpeg () возвращает изображение идентификатор, представляющий изображение получается из заданного имени файла.

Но на самом деле то, что у вас есть, хорошо.


Отображает ли сообщение об ошибке

    echo 'The URL was not passed into our function';

Или вообще ничего?

Если отображается сообщение об ошибке, возможно, проверка === не выполнена:

Ресурс изображения будет возвращен успех. ЛОЖЬ возвращается, если тип изображения не поддерживается, данные не в признанном формате, или изображение повреждено и не может быть загружено.

Кроме того, на вашем сервере разработки максимально загружено журналирование ошибок? Таким образом, вы можете увидеть возможные предупреждения?

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