добавление изображения в массив и отправка через curl

1

У меня проблемы с отправкой изображения с URL-адреса на удаленный хост с помощью curl. Все остальное работает.

// assemble full image path

foreach ( $respArr[ 'imgs' ] as $k => $v) {

    $car[ 'photos' ][ $k ] = file_get_contents( 'http://' . $v[ 'ipt' ] . '/im/im-' . $v[ 'ikey' ] ); // full url?

}

Проблема в том, что я не понимаю, как браузер отправляет изображения, он создает массив, чем это содержимое массива невидимо для меня, когда я пытаюсь сбрасывать $ _POST.

Любые разъяснения в этой области приветствуются :)

  • 1
    Вы пытались использовать класс CURLFile ? или, если вы используете PHP-версию EOL, используя @'/path/to/file' ?
  • 0
    @EliasVanOotegem Я подражаю обычному пользовательскому сообщению из формы. Мне нужно собрать массив php, как сделал бы браузер, и отправить его в мой API.
Показать ещё 2 комментария
Теги:
curl
post

2 ответа

0

Грубый, но в 9/10 раз достаточный подход к моделированию POST-submit с использованием curl будет выглядеть так:

$ch = curl_init();
$opts = [
    \CURLOPT_HEADER         => true,
    \CURLOPT_RETURNTRANSFER => true,
    \CURLOPT_URL            => 'http://your.dom/submit/route',
    \CURLOPT_POST           => true,
    \CURLOPT_POSTFIELDS     => [
        'image'  => new \CURLFile('/path/to/img.png'),
        //pre 5.5
        'image2' => "@/path/to/img.png",
        //fields like foo[]
        'foo'    => [
            'val1',
            'val2',
            '',//empty
        ],
        'otherField' => '123',
        //fields like user[name] and user[lastName]
        'user'       => [
            'name'     => 'John',
            'lastName' => 'Doe',
        ],
    ]
];
curl_setopt_array($opts);
$response = curl_exec($ch);
$debugInfo = curl_getinfo($ch);
//error:
$message = curl_error($ch);
$errNr = curl_errno($ch);
curl_close($ch);

Что касается использования удаленных изображений (URL-адресов), вы можете рассмотреть возможность создания функции tempnam:

//construct file array:
$photos = [];//files you'll add to your curl request
foreach ($files as $v) {
    $tmpFile = tempnam('/tmp/curlfiles');
    //write image to tmp file
    file_put_contents(
        $tmpFile,
        //contents == get the image
        file_get_contents(
            'http://' . $v['ipt'] . '/im/im-' . $v['ikey']
        )
    );
    //add CURLFile resource
    $photos[] = new CURLFile($tmpFile);
    //or $photos[] = "@$tmpFile";...
}
//then, in $opts:
$opts[\CURLOPT_POSTFIELDS]['photos'] = $photos;
//curl_setopt_array && curl_exec etc...

На страницах руководства для конструкции CURLFile::__construct есть некоторые фрагменты, которые вы могли бы использовать, если у вас нет CURLFile в вашем распоряжении, но, увидев, что вы уже используете 5.5, это не должно быть проблемой

  • 0
    Спасибо! но это не сработает. Поскольку я использую удаленный API, удаленный сервер получает только путь к временному файлу отправляющего сервера ...
0

Я думаю, вы можете сделать следующее:

$image       = file_get_contents(PATH_TO_IMAGE);
$imageBase64 = base64_encode($image);

Теперь вы можете перенести изображение через завиток, как обычные данные
Однажды, он будет передан, вы должны использовать его, как следует в своем браузере

print '<img src="data:image/png;base64' . $imageBase64 .'">';

image/TYPE: вы также должны перенести правильный тип изображения: gif, jpg...

Надеюсь, это поможет :)

  • 0
    Привет, я не думаю, что этого достаточно. Я подражаю сообщению браузера на странице, как обычный пользователь сделал бы с помощью curl.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню