Я пытаюсь сделать запрос POST
удаленному серверу с целью загрузки в него файла изображения. Я пытаюсь использовать метод PHP file_get_contents()
для вывода файла в строчном формате, однако он, кажется, обрезает последнюю границу в корпусе POST
.file_get_contents(), кажется, обрезает границу
PHP код, где я устанавливаю мой POST
тело и заголовки:
$boundary = '------------' . uniqid();
$curl->setHTTPHeader(array(
'Accept' => 'application/xml',
'Content-Type' => 'multipart/form-data;boundary=' . $boundary
));
$img_data = getimagesize($img_file);
$file_contents = file_get_contents($img_file);
$xml_body = "\r\n";
$xml_body .= $boundary . "\r\n" .
"Content-Disposition: form-data; name=\"data\"\r\n\r\n" .
"<Image><filename>" . basename($img_file) . "</filename>" .
"<description>test</description>" .
"</Image>" .
"\r\n\r\n" .
$boundary . "\r\n";
$xml_body .= "Content-Disposition: form-data; name=\"image\"; filename=\"" . basename($img_file) . "\"\r\n" .
"Content-Type: " . $img_data['mime'] . "\r\n" .
"\r\n" . $file_contents . "\r\n" .
$boundary . "--"; // <-- this part doesn't seem to show up in the body
$body = $xml_body;
При попытке распечатать (используя error_log()
) тело до того, как запрос был сделан, похоже, нижняя граница отрезан:
[16-Mar-2016 06:15:45 UTC] Array
(
[method] => POST
[timeout] => 60
[redirection] => 5
[httpversion] => 1.1
[user-agent] => [redacted]
[reject_unsafe_urls] =>
[blocking] => 1
[headers] => Array
(
[Accept] => application/xml
[Content-Type] => multipart/form-data;boundary=------------56e8fa112c4b0
[connection] => close
[Accept-Encoding] => deflate;q=1.0, compress;q=0.5, gzip;q=0.5
[Content-Length] => 152510
)
[cookies] => Array
(
)
[body] =>
------------56e8fa112c4b0
Content-Disposition: form-data; name="data"
<Image><filename>my-pic.jpg</filename><description></description></Image>
------------56e8fa112c4b0
Content-Disposition: form-data; name="image"; filename="my-pic.jpg"
Content-Type: image/jpeg
ÿØÿà
Мне любопытно 2 вещи:
1) Я настройке запрос правильно? Прямо сейчас, когда я тестирую его, удаленный сервер отвечает кодом состояния 401
http, что означает, что он не работает.
2) Почему нижняя граница не отображается в моем журнале ошибок?
Мне не хватало заголовка 'Authorization'. Теперь я получаю '405', так что, по крайней мере, я это преодолею. Удаленный сервер предполагает, что я не отправляю «тело ввода» с моим POST-запросом, но после выполнения немного отладки AFAIK тело отправляется через - любые рекомендации по следующим шагам, чтобы выяснить, почему я получаю ' 405' ответ? Я также тестировал через почтальона и смог сделать тот же запрос без проблем. –
405 означает, что метод не разрешен, как вы знаете. В этом случае первое, что я проверил, это то, что вы должны делать PUT вместо POST и убедиться, что верный URL-адрес верен. Возможно, вам также понадобится заголовок Content-type: application/xml в части XML. – drew010