@mozillla

Как отправить файл из php post запросом?

Есть пример запроса на curl
curl -u 'mi@user':la@pass-X POST -F
orders=@../orders/shipments_22.10.2010_part_1.xml https://site.ru/api/upload.xml

Нужен аналог запроса на php.
Я написал так
<?
$user = 'mi@user';
$pass = 'la@pass';
$url  = 'https://site.ru/api/upload.xml';

$postdata = http_build_query(
        array(
            'orders' => file_get_contents($_SERVER['DOCUMENT_ROOT'] . '\\orders\\shipments_22.10.2010_part_1.xml'
        )));

$params  = array('http' => array(
        'method'  => 'POST',
        'header'  => 'Authorization: Basic ' . base64_encode($user . ":" . $pass),
        'content' => $postdata)
);
$context = stream_context_create($params);

if ($remote = fopen($url, 'rb', false, $context)) {
    $response = @stream_get_contents($remote);
}
Header('Content-type: text/xml');
echo($response);
die();

Проблема в
http_build_query
она превращает все данные в urlencode.
Принимающий сервер я не контролирую, так что никаких urldecode при приёме.
Что можно сделать с учетом того, что запускаться скрипт будет не пойми где, так что никаких exec('curl') и curl_*();
  • Вопрос задан
  • 7326 просмотров
Решения вопроса 1
KorsaR-ZN
@KorsaR-ZN
Вам нужно отправить multipart/form-data

Пример формирование данных для stream_context_create
$user = 'mi@user';
$pass = 'la@pass';
$url = 'https://site.ru/api/upload.xml';
$file = $_SERVER['DOCUMENT_ROOT'] . '\\orders\\shipments_22.10.2010_part_1.xml';
$boundary = '---------------------' . substr(md5(rand(0, 32000)), 0, 10);

$postData = '';
$postData .= '--' . $boundary . "\n";
$postData .= 'Content-Disposition: form-data; name="orders"; filename="' . basename($file) . '"' . "\n";
$postData .= 'Content-Type: text/xml' . "\n";
$postData .= 'Content-Transfer-Encoding: binary' . "\n\n";
$postData .= file_get_contents($file) . "\n";
$postData .= '--' . $boundary . "\n";

$params = array
(
    'http' => array
    (
        'method' => 'POST',
        'content' => $postData,
        'header' => array
        (
            'Authorization: Basic ' . base64_encode($user . ':' . $pass),
            'Content-Type: multipart/form-data; boundary=' . $boundary
        )
    )
);

$context = stream_context_create($params);
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
FanatPHP
@FanatPHP
Чебуратор тега РНР
И что - принимающий сервер не принимает?
Ответ написан
Melkij
@Melkij
PostgreSQL DBA
она превращает все данные в urlencode.

curl -F тоже.

Вы отправляете файл - вам требуется сформировать multipart/form-data (RFC2388), а не простой application/x-www-form-urlencoded.
Ответ написан
toxa82
@toxa82
Попробуйте curl, вроде проще чем через соккеты.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽