@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_*();
  • Вопрос задан
  • 7321 просмотр
Решения вопроса 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, вроде проще чем через соккеты.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы