Как получить изображение / PNG-контент через PHP - PullRequest
4 голосов
/ 23 февраля 2012

Это мой первый пост в переполнении стека, поэтому, пожалуйста, прости меня, если я использовал неправильное форматирование или соглашения. Я пытаюсь написать тестовый сценарий, который получает изображение в формате png с веб-страницы POST (multipart / form-data), удаляет опубликованное изображение и передает его третьему лицу как Content-Type: image / png.

У меня есть php-файл (catcher.php), который является получателем перенаправленного изображения. Post.php, файл php, который отправляет загруженное изображение в catcher.php, находится ниже:

<?php
    $img = imagecreatefrompng($_FILES['myfile']['tmp_name']);
    imagepng($img);
    $opts = array(
        'http'=>array(
            'method'=>"POST",
            'content'=>$img,
            'header'=>"Content-Type: image/png\r\n"               
        )
    );

    $context = stream_context_create($opts);
    file_get_contents( "http://localhost/catcher.php", false, $context);
?>

Post.php прекрасно получает файл с веб-страницы, которая публикует его как multipart / form-data, однако я не уверен, как получить доступ к содержимому image / png в catcher.php.

У меня вопрос, в catcher.php, как мне получить доступ к содержанию изображения? Я пробовал $ _POST ['content'] и получаю следующую ошибку: "Неопределенный индекс: контент". Так что я знаю, что просто не ищу правильные данные. Существует ли конкретная суперглобальная переменная, такая как $ _POST или $ _REQUEST, которую я могу использовать для доступа к содержимому размещенного изображения, или есть какое-то другое решение?

РАЗРЕШЕНИЕ Я смог найти результат, который искал, с помощью следующего кода для catcher.php:

$input = fopen("php://input","+r");
$destination = fopen($target_path, 'w');

stream_copy_to_stream($input, $destination);

fclose($input);
fclose($destination);
?>

Спасибо вам и Марку, и Брендену за ваши оперативные ответы!

Ответы [ 2 ]

3 голосов
/ 23 февраля 2012

imagepng($img) немедленно выводит двоичный мусор, содержащий PNG. это не записано в переменную. На самом деле вы публикуете строку, которая, вероятно, говорит «Ресурс GD # 7» или что-то подобное.

Весь бит imagepng () в любом случае бесполезен - вы декодируете PNG в представление в памяти, а затем снова пытаетесь перекодировать в PNG. Бессмысленная трата памяти, поскольку файл уже находится на диске. Вы можете сделать все это с помощью:

<?php
if ($_FILES['myfile']['error'] !== UPLOAD_ERR_OK) {
   die("Upload failed with error code " . $_FILES['myfile']['error']);
}

$opts = array(
    'http'=>array(
        'method'=>"POST",
        'content'=> file_get_contents($_FILES['myfile']['tmp_name']),
        'header'=>"Content-Type: image/png\r\n"               
    )
);

$context = stream_context_create($opts);
file_get_contents( "http://localhost/catcher.php", false, $context);

Обратите внимание, что добавлена ​​проверка на успешность загрузки - если загрузка прошла успешно, вам будет грустно.

При этом вы также не выполняете надлежащую загрузку POST-файла. Чтобы это работало, вы должны фактически смоделировать полноценную HTML-форму с <input type="file"> присутствует, enctype="multipart/form-data" и еще много чего. Все, что вы делаете, это отправляете необработанный PNG на сервер.

Вероятно, вы можете получить его, прочитав php://input в вашем скрипте catcher.

1 голос
/ 23 февраля 2012

Проблема в том, что ваши данные не кодируются как multipart / form-data , это просто PNG.

У вас есть два варианта:

  1. Кодируйте данные правильно для POST - тогда вы можете прочитать их с $_POST или $_REQUEST.
  2. Сохраните post.php как есть и считывайте необработанные данные из php: // input in catcher.php.

Для варианта 1 это выглядит так: HttpRequest обрабатывает кодирование формы для вас.

...